当尝试使用反射获取字段信息时,我需要使用代码
SomeObject.GetType().GetField(
"FieldName",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
特别是,我必须同时指定BindingFlags.NonPublic
和 BindingFlags.Instance
。如果我只指定一个,我得到一个空的回报。
如果我只查看单个字段,为什么需要指定多个绑定标志类型?
答案 0 :(得分:4)
这些标志起到某种过滤器的作用。
如果省略BindingFlags.NonPublic
,则GetField()
功能不会查找private
,internal
和protected
字段。
您必须指定BindingFlags.Instance
或BindingFlags.Static
来定义您要查找的内容。
请参阅http://msdn.microsoft.com/en-us/library/6ztex2dc.aspx:
您必须指定 BindingFlags.Instance 或 BindingFlags.Static 才能获得回复。
...
指定 BindingFlags.NonPublic 以在搜索中包含非公共字段(即私有,内部和受保护字段)。仅返回基类上的受保护和内部字段;不返回基类上的私有字段。
答案 1 :(得分:3)
这是搜索的实现方式。来自MSDN(Note
部分):
您必须指定Instance或Static以及Public或NonPublic或 没有会员将被退回。
答案 2 :(得分:2)
每个BindingFlag
都有含义
标记不会指定您将收到多少字段,但应使用哪种字段GetField
方法
例如,如果您未指定NonPublic
,那么您可能无法检索任何私有,受保护或内部字段
在你的情况下
其他常见标志
更多关于BindingFlags
答案 3 :(得分:1)
标志形成一个过滤器。它们定义了返回的字段类型。如果您的字段不是公共字段且是实例字段(即不是静态字段),则需要包含这些标记。
您还可以指定其他标记,例如BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static
,以便包含其他字段类型。
答案 4 :(得分:1)
如果它是:System.Reflection.BindingFlags.Instance
- 来自msdn:
您必须指定BindingFlags.Instance或BindingFlags.Static 为了获得回报。
需要该标志来确定您想要获得静态或非静态成员(或两者)。
下一个System.Reflection.BindingFlags.NonPublic
告诉您,您希望获得非公开成员(默认情况下,在课外不可见)。字段通常是私有的,这就是为什么在尝试使用null
检索字段时可能会获得BindingFlags.Public
。