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
最后更新于 2023-04-24 15:28:43 并被添加「」标签,已有 677 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
此处评论已关闭