内容简介:使用 .NET 的反射 API 时,通常会要求我们传入一个本文介绍这些标记用于反射的时候查找类型成员:
使用 .NET 的反射 API 时,通常会要求我们传入一个 BindingFlags
参数用于指定反射查找的范围。不过如果对反射不熟的话,第一次写反射很容易写错导致找不到需要的类型成员。
本文介绍 BindingFlags
中的各个枚举标记的含义、用途,以及常用的组合使用方式。
所有的 BindingFlags
默认值
// 默认值 Default
查找
这些标记用于反射的时候查找类型成员:
// 表示查找的时候,需要忽略大小写。 IgnoreCase // 仅查找此特定类型中声明的成员,而不会包括这个类继承得到的成员。 DeclaredOnly // 仅查找类型中的实例成员。 Instance // 仅查找类型中的静态成员。 Static // 仅查找类型中的公共成员。 Public // 仅查找类型中的非公共成员(internal protected private) NonPublic // 会查找此特定类型继承树上得到的静态成员。但仅继承公共(public)静态成员和受保护(protected)静态成员;不包含私有静态成员,也不包含嵌套类型。 FlattenHierarchy
调用
这些标记用于为 InvokeMember
方法提供参数,告知应该如何反射调用一个方法:
// 调用方法。 InvokeMethod // 创建实例。 CreateInstance // 获取字段的值。 GetField // 设置字段的值。 SetField // 获取属性的值。 GetProperty // 设置属性的值。 SetProperty
其他
接下来下面的部分就不是那么常用的了。
这些标记用于为 InvokeMember
方法提供参数,但是仅在调用一个 COM 组件的时候才应该使用:
PutDispProperty PutRefDispProperty
ExactBinding SuppressChangeType
OptionalParamBinding
下面是一些杂项……
// 忽略返回值(在 COM 组件的互操作中使用) IgnoreReturn // 反射调用方法时如果出现了异常,通常反射会用 TargetInvocationException 包装这个异常。 // 此标记用于禁止把异常包装到 TargetInvocationException 中。 DoNotWrapExceptions
你可能会有的疑问
-
如果 A 程序集对 B 程序集内部可见(
InternalsVisibleTo("B")),那么 B 在反射查找 A 的时候,internal成员的查找应该使用Public还是NonPublic标记呢?NonPublic
常用的组合
从上面的解释中可以发现,这个类型的设计其实是有问题的,不符合单一职责原则。所以我们会在不同的使用场景下使用不同区域的组合。
查找,也就是获取一个类型中的字段、属性、方法等的时候使用的。
拿到所有成员:
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance
实际上
RuntimeReflectionExtensions.Everything
属性就是这么写的。
拿到公有的实例成员:
BindingFlags.Public | BindingFlags.Instance
附 BindingFlags 的源码
[Flags]
public enum BindingFlags
{
// NOTES: We have lookup masks defined in RuntimeType and Activator. If we
// change the lookup values then these masks may need to change also.
// a place holder for no flag specifed
Default = 0x00,
// These flags indicate what to search for when binding
IgnoreCase = 0x01, // Ignore the case of Names while searching
DeclaredOnly = 0x02, // Only look at the members declared on the Type
Instance = 0x04, // Include Instance members in search
Static = 0x08, // Include Static members in search
Public = 0x10, // Include Public members in search
NonPublic = 0x20, // Include Non-Public members in search
FlattenHierarchy = 0x40, // Rollup the statics into the class.
// These flags are used by InvokeMember to determine
// what type of member we are trying to Invoke.
// BindingAccess = 0xFF00;
InvokeMethod = 0x0100,
CreateInstance = 0x0200,
GetField = 0x0400,
SetField = 0x0800,
GetProperty = 0x1000,
SetProperty = 0x2000,
// These flags are also used by InvokeMember but they should only
// be used when calling InvokeMember on a COM object.
PutDispProperty = 0x4000,
PutRefDispProperty = 0x8000,
ExactBinding = 0x010000, // Bind with Exact Type matching, No Change type
SuppressChangeType = 0x020000,
// DefaultValueBinding will return the set of methods having ArgCount or
// more parameters. This is used for default values, etc.
OptionalParamBinding = 0x040000,
// These are a couple of misc attributes used
IgnoreReturn = 0x01000000, // This is used in COM Interop
DoNotWrapExceptions = 0x02000000, // Disables wrapping exceptions in TargetInvocationException
}
参考资料
以上所述就是小编给大家介绍的《详解 .NET 反射中的 BindingFlags 以及常用的 BindingFlags 使用方式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Fortran95程序设计
彭国伦 / 中国电力出版社 / 2002-9 / 59.00元
本书介绍了当前国际上广泛流行的高级算法语言Fortran的全新版本Fortran 95。 本书循序渐进、由浅到深,使用结构化及面向对象程序设计观念,以简捷明了的方式把Fortran 95介绍给读者。书中主要讲述了Fortran 95程序设计的方法,包括数值计算、计算机绘图、窗口程序设计、与Visual C/Visual Basic/Delphi的链接、甚至是游戏程序的编写。 本书语言简洁,实......一起来看看 《Fortran95程序设计》 这本书的介绍吧!