C#反射:PropertyInfo、FieldInfo和MemberInfo的区别

PropertyInfo、FieldInfo和MemberInfo的区别

在C#反射机制中,PropertyInfo、FieldInfo和MemberInfo的区别
我们做如下实验

public class ttt
{
    public int test = 6;
    private int privateTest = 5;
    public string pubStr = "ceshi";
    public string pubSetStr { get; set; } = "ceshi2";
}

Type tt = typeof(ttt);
TypeInfo tf = tt.GetTypeInfo();
MemberInfo[] ml = tt.GetMembers();
PropertyInfo[] pl = tt.GetProperties();
FieldInfo[] fl = tt.GetFields();

我们分别将其输出后得到如下结果

MemberInfo: test/pubStr/pubSetStr/所有方法
PropertyInfo[] : pubSetStr
FieldInfo[] : test/pubStr

PropertyInfo 仅限于带有get,set 的成员变量,称为属性
FieldInfo public的成员变量,并且不是property
MemberInfo 首先是FieldInfo和PropertyInfo的集合,另外包含了该Type所包含的函数。
共同点是private的 成员变量都没有出现

BindingFlags 用于指定反射查找的范围

注意: C#反射查找方法时默认只查找public方法,如果需要查找其他,需要设置 BindingFlags,也就是上例中的情况。

public enum BindingFlags
{
    // 默认
    Default = 0,
    // 忽略大小写
    IgnoreCase = 1,
    // 查找在当前类中声明的成员,不包括继承来的成员
    DeclaredOnly = 2,
    // 仅查找实例
    Instance = 4,
    // 仅查找静态成员
    Static = 8,
    // 仅查找公共成员
    Public = 16,
    // 仅查找非公共成员
    NonPublic = 32,
    // 会查找继承树上得到的静态成员,仅包括public和protect静态成员,不包括private静态成员,也不包括嵌套类型
    FlattenHierarchy = 64,
    // 此标志会传递给 InvokeMember 方法以调用方法。
    InvokeMethod = 256,
    // 此标志会传递给 InvokeMember 方法以调用构造函数。
    CreateInstance = 512,
    // 指定应返回指定字段的值,此标志会传递给 InvokeMember 方法以获取字段值。
    GetField = 1024,
    // 指定应设置指定字段的值。 此标志会传递给 InvokeMember 方法以设置字段值。
    SetField = 2048,
    // 指定应返回指定属性的值此标志会传递给 InvokeMember 方法以调用属性 getter。
    GetProperty = 4096,
    // 指定应设置指定属性的值。 对于 COM 属性,指定此绑定标志等效于指定 PutDispProperty 和 PutRefDispProperty。
    SetProperty = 8192,
    // 
    PutDispProperty = 16384,
    // 
    PutRefDispProperty = 32768,
    // 
    ExactBinding = 65536,
    // 
    SuppressChangeType = 131072,
    // 
    OptionalParamBinding = 262144,
    // 
    IgnoreReturn = 16777216,
    DoNotWrapExceptions = 33554432
}

常用组合:

指定Public修饰的实例成员
BindingFlag.Public | BindingFlags.Instance

指定Public修饰 的静态成员
BindingFlag.Public | BindingFlags.Static

指定private/protect/internal 修饰的实例成员
BindingFlag.NonPublic | BindingFlags.Instance

指定private/protect/internal修饰 的静态成员
BindingFlag.NonPublic | BindingFlags.Static

指定public修饰的静态成员和实例成员
BindingFlag.Public | BindingFlags.Static | BindingFlags.Instance

指定private/protect/internal修饰 的静态成员和实例成员
BindingFlag.NonPublic | BindingFlags.Static | BindingFlags.Instance

此处评论已关闭