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

本文关键字:标志 绑定 获取 单个 信息 字段 类型 种类 为什么 | 更新日期: 2023-09-27 18:14:15

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

SomeObject.GetType().GetField(
    "FieldName",
    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
特别是,我必须同时指定BindingFlags.NonPublic BindingFlags.Instance。如果我只指定一个,我得到一个空返回值。

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

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

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

如果省略BindingFlags.NonPublic,则GetField()函数不会查找private, internalprotected字段。

您必须指定BindingFlags.InstanceBindingFlags.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