【C#反射】BindingFlags 枚举
BindingFlags 枚举用途:Type的类方法中,用于筛选成员。
type.InvokeMember方法中
type.GetConstructor 方法中
type.GetFiles方法中
type.GetMethod方法中
type.GetNestedType方法中
type.GetMember方法中
[Flag] public enum BindingFlags { Default = 0, IgnoreCase = 1, DeclaredOnly = 2, Instance = 4, static = 8, Public = 16, NonPublic = 32, FlattenHierarchy = 64, InvokeMethod = 256, CreateInstance = 512, GetField = 1024, SetField = 2048, GetProperty = 4096, SetProperty = 8192, PutDispProperty = 16384, PutRefDispProperty = 32768, ExactBinding = 65536, SuppressChangeType = 131072, OptionalParamBinding = 262144, IgnoreReturn = 16777216, DoNotWrapExceptions = 33554432 }
Default:
IgnoreCase:表示忽略 name 的大小写。
DeclaredOnly:仅搜索在 Type 上声明的成员,而不搜索被继承的成员。
Instance:获取实例成员,不包括 virtual、static 成员,要和Public或者NonPublic一起使用,单个无法获取内容。
Static:获取静态成员,要和Public或者NonPublic一起使用,单个无法获取内容。
Public:获取公开成员
NonPublic:获取私有成员和受保护的成员
FlattenHierarchy :没明白
InvokeMethod:此标志会传递给 InvokeMember
方法以调用方法。
CreateInstance:此标志会传递给 InvokeMember
方法以调用构造函数。
GetField:指定应返回指定字段的值,此标志会传递给 InvokeMember
方法以获取字段值。
SetField:指定应设置指定字段的值。 此标志会传递给 InvokeMember 方法以设置字段值。
GetProperty:指定应返回指定属性的值此标志会传递给 InvokeMember 方法以调用属性 getter。
setProperty:指定应设置指定属性的值。 对于 COM 属性,指定此绑定标志等效于指定 PutDispProperty 和 PutRefDispProperty。
---------------------------------------------------接下来下面的部分就不是那么常用的了。
这些标记用于为 InvokeMember
方法提供参数,但是仅在调用一个 COM 组件的时候才应该使用:
PutDispProperty:不知道咋用
PutRefDispProperty:不知道咋用
ExactBinding :不知道咋用
SuppressChangeType:未实现
OptionalParamBinding :不知道咋用
IgnoreReturn :在 COM 互操作中用于指定可以忽略成员的返回值。
DoNotWrapExceptions:未知\ 反射调用方法时如果出现了异常,通常反射会用 TargetInvocationException 包装这个异常。 此标记用于禁止把异常包装到 TargetInvocationException 中。
下列示例使用所有反射 *Info 类和 BindingFlags 来列出指定类的全体成员(构造函数、字段、属性、事件和方法),并将成员区分为静态和实例类别 。
// This program lists all the members of the // System.IO.BufferedStream class. using System; using System.IO; using System.Reflection; class ListMembers { public static void Main() { // Specifies the class. Type t = typeof(System.IO.BufferedStream); Console.WriteLine("Listing all the members (public and non public) of the {0} type", t); // Lists static fields first. FieldInfo[] fi = t.GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine("// Static Fields"); PrintMembers(fi); // Static properties. PropertyInfo[] pi = t.GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine("// Static Properties"); PrintMembers(pi); // Static events. EventInfo[] ei = t.GetEvents(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine("// Static Events"); PrintMembers(ei); // Static methods. MethodInfo[] mi = t.GetMethods (BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine("// Static Methods"); PrintMembers(mi); // Constructors. ConstructorInfo[] ci = t.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine("// Constructors"); PrintMembers(ci); // Instance fields. fi = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine("// Instance Fields"); PrintMembers(fi); // Instance properites. pi = t.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Instance Properties"); PrintMembers(pi); // Instance events. ei = t.GetEvents(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine("// Instance Events"); PrintMembers(ei); // Instance methods. mi = t.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine("// Instance Methods"); PrintMembers(mi); Console.WriteLine("\r\nPress ENTER to exit."); Console.Read(); } public static void PrintMembers (MemberInfo [] ms) { foreach (MemberInfo m in ms) { Console.WriteLine ("{0}{1}", " ", m); } Console.WriteLine(); } }