当尝试使用反射获取字段信息时,我需要使用代码
SomeObject.GetType().GetField(
"FieldName",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
特别是,我必须同时指定BindingFlags.NonPublic
和 BindingFlags.Instance
。如果我只指定一个,我得到一个空返回值。
如果我只看一个字段,为什么我需要指定多个绑定标志类型?
这些标志起着某种过滤器的作用。
如果省略BindingFlags.NonPublic
,则GetField()
函数不会查找private
, internal
和protected
字段。
您必须指定BindingFlags.Instance
或BindingFlags.Static
来定义您要查找的内容。
见http://msdn.microsoft.com/en-us/library/6ztex2dc.aspx:
必须指定BindingFlags。实例或绑定标志。静态,以便获得返回值。
…
指定 BindingFlags。NonPublic在搜索中包含非公共字段(即私有、内部和受保护的字段)。只返回基类上的受保护字段和内部字段;基类上的私有字段不返回。
这就是搜索的实现方式。来自MSDN(在Note
部分):
必须指定Instance或Static以及Public或NonPublic或不返回任何成员。
每个BindingFlag
都有意义
标志没有指定你将接收多少个字段,而是指定GetField
方法应该寻找什么样的字段
例如,如果您没有指定NonPublic
,那么您可能无法检索任何私有,受保护或内部字段
在你的情况下
- NonPublic -你想要的属性不是公共的
- Instance -你想要的字段是一个实例字段而不是一个静态字段
其他常用标志
- DeclaredOnly—在类中声明,而不是继承
- 扁平化层次-它将查看给定名称的每个基类
- IgnoreCase - as暗示忽略了名称 的大小写
- Public -查找公共成员
- Static -查找静态成员
关于BindingFlags的更多信息
标志形成一个过滤器。它们定义返回字段的类型。如果你的字段不是公共的,而是一个实例字段(即不是一个静态字段),你需要包括这些标志。
您也可以指定额外的标志,如BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static
,以包括其他的文件类型。
如果是:System.Reflection.BindingFlags.Instance
- from msdn:
必须指定其中一个BindingFlags。Instance或BindingFlags。静态为了得到一个回报。
(源)
该标志用于确定是要获取Static成员还是Non-Static成员(或两者都要)。
下一步System.Reflection.BindingFlags.NonPublic
告诉你,你想要获得非公共成员(默认情况下,在类外不可见)。字段通常是私有的,这就是为什么当您试图检索字段而没有BindingFlags.Public
时可能会得到null
。