在.NETreflection中使用GetProperties()和BindingFlags.DeclaredOnly

如果我使用

sometype.GetProperties(); 

我从types中获得所有的属性,它是父类。 不过,我只想检索在这种types(而不是父母)明确定义的属性。 我以为这是BindingFlags.DeclaredOnly选项的目的。

但是,当我尝试这个:

 sometype.GetProperties(BindingFlags.DeclaredOnly); 

我得到0个属性。

任何人都知道我在做什么错了?

如果您指定了任何BindingFlags ,那么您需要明确指定要获取的属性。 例如:

 sometype.GetProperties (BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); 

总结:

  1. 如果您使用GetProperties()重载(不带参数),您将获得所有公共属性

  2. 另一方面,如果使用GetProperties(BindingFlags)重载(接受BindingFlags参数的重载),则需要为每组下列标志中的至less一个指定一个按位或:

    • BindingFlags.Instance / BindingFlags.Static (实例vs静态属性),
    • BindingFlags.Public / BindingFlags.NonPublic (公共vs非公共属性)。

例如,要获取公共静态属性,您需要调用GetProperties(BindingFlags.Public | BindingFlags.Static)以获得结果。 只调用GetProperties(BindingFlags.Public)GetProperties(BindingFlags.Static)不会返回任何结果。

还要注意,指定BindingFlags.Default将返回一个空数组

详细信息可以在GetProperties(BindingFlags)的MSDN文档中find:

以下BindingFlags 过滤标志可用于定义search中包含的嵌套types:

  • 您必须指定BindingFlags.InstanceBindingFlags.Static才能获得回报。
  • 指定BindingFlags.Public在search中包含公共属性。
  • 指定BindingFlags.NonPublic在search中包含非公共方法(即私有,内部和受保护的方法)。 只有基类的保护和内部方法被返回; 基类上的私有方法不会被返回。
  • 指定BindingFlags.FlattenHierarchy在层次结构中包含公共和受保护的静态成员; 不包括inheritance类中的私有静态成员。

以下BindingFlags 修饰符标志可用于更改search的工作方式:

  • BindingFlags.DeclaredOnly仅search在Type上声明的属性,而不是仅仅inheritance的属性。

你需要扩展你的BindingsFlag。 他们至less需要包括什么访问级别和实例与静态以获得任何有意义的东西。

我觉得你实际上在寻找的是以下内容

 var flags = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public; someType.GetProperties(flags); 

从MSDN网站。

默认(成员)指定没有绑定标志。

您必须指定实例或静态一起Public或NonPublic或没有成员将被返回。

因此除非你指定绑定标志,

我使用typeof(Thing)有问题,最终这对我工作:

  var thisThing = (new Thing()).GetType(); foreach (var property in thisThing.GetProperties()) { // ... }