为什么我需要指定多种类型的绑定标志来获取单个字段的信息?

时间:2014-07-22 13:56:54

标签: c# reflection

当尝试使用反射获取字段信息时,我需要使用代码

SomeObject.GetType().GetField(
    "FieldName",
    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)

特别是,我必须同时指定BindingFlags.NonPublic BindingFlags.Instance。如果我只指定一个,我得到一个空的回报。

如果我只查看单个字段,为什么需要指定多个绑定标志类型?

5 个答案:

答案 0 :(得分:4)

这些标志起到某种过滤器的作用。

如果省略BindingFlags.NonPublic,则GetField()功能不会查找privateinternalprotected字段。

您必须指定BindingFlags.InstanceBindingFlags.Static来定义您要查找的内容。

请参阅http://msdn.microsoft.com/en-us/library/6ztex2dc.aspx

  

您必须指定 BindingFlags.Instance BindingFlags.Static 才能获得回复。

     

...

     

指定 BindingFlags.NonPublic 以在搜索中包含非公共字段(即私有,内部和受保护字段)。仅返回基类上的受保护和内部字段;不返回基类上的私有字段。

答案 1 :(得分:3)

这是搜索的实现方式。来自MSDNNote部分):

  

您必须指定Instance或Static以及Public或NonPublic或   没有会员将被退回。

答案 2 :(得分:2)

每个BindingFlag都有含义

标记不会指定您将收到多少字段,但应使用哪种字段GetField方法

例如,如果您未指定NonPublic,那么您可能无法检索任何私有,受保护或内部字段

在你的情况下

  • NonPublic - 您想要的财产不公开
  • 实例 - 您所需的字段是实例字段而非静态字段

其他常见标志

  • DeclaredOnly - 在类中声明,而不是继承一个
  • FlattenHierarchy - 它将查看给定名称的每个基类
  • IgnoreCase - 暗示忽略了名称
  • 的大小写
  • 公开 - 寻找公众成员
  • 静态 - 查找静态成员

更多关于BindingFlags

答案 3 :(得分:1)

标志形成一个过滤器。它们定义了返回的字段类型。如果您的字段不是公共字段且是实例字段(即不是静态字段),则需要包含这些标记。

您还可以指定其他标记,例如BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static,以便包含其他字段类型。

答案 4 :(得分:1)

如果它是:System.Reflection.BindingFlags.Instance - 来自msdn:

  

您必须指定BindingFlags.Instance或BindingFlags.Static   为了获得回报。

(source)

需要该标志来确定您想要获得静态或非静态成员(或两者)。

下一个System.Reflection.BindingFlags.NonPublic告诉您,您希望获得非公开成员(默认情况下,在课外不可见)。字段通常是私有的,这就是为什么在尝试使用null检索字段时可能会获得BindingFlags.Public