在.NET Reflection中使用GetProperties()和BindingFlags.DeclaredOnly

UpT*_*eek 57 .net c# reflection

如果我使用

sometype.GetProperties();
Run Code Online (Sandbox Code Playgroud)

我从类型中获取所有属性,并且它是父级.但是我只想检索在这种类型中显式定义的属性(而不是父类).我认为那是BindingFlags.DeclaredOnly选项的用途.

但是,当我尝试这个:

sometype.GetProperties(BindingFlags.DeclaredOnly);
Run Code Online (Sandbox Code Playgroud)

我得到0个属性.

谁知道我做错了什么?

Pet*_*ete 82

如果指定any BindingFlags,则需要明确指定要获取的属性.例如:

sometype.GetProperties (BindingFlags.DeclaredOnly | 
                        BindingFlags.Public | 
                        BindingFlags.Instance);
Run Code Online (Sandbox Code Playgroud)


Gro*_*roo 47

总结一下:

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

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

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

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

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

有关详细信息,请参阅GetProperties(BindingFlags)的MSDN文档:

以下BindingFlags 过滤器标志可用于定义要包含在搜索中的嵌套类型:

  • 您必须指定BindingFlags.InstanceBindingFlags.Static返回以获得退货.
  • 指定BindingFlags.Public在搜索中包含公共属性.
  • 指定BindingFlags.NonPublic在搜索中包含非公共方法(即私有,内部和受保护方法).仅返回基类上的受保护和内部方法; 不返回基类的私有方法.
  • 指定BindingFlags.FlattenHierarchy在层次结构中包含公共和受保护的静态成员; 不包括继承类中的私有静态成员.

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

  • BindingFlags.DeclaredOnly 仅搜索在Type上声明的属性,而不是仅继承的属性.


Jar*_*Par 15

你需要稍微扩展你的BindingsFlag.他们需要至少包括可访问性级别和实例与静态,以便获得任何有意义的东西.

我认为您实际需要的是以下内容

var flags = BindingFlags.DeclaredOnly 
  | BindingFlags.Instance
  | BindingFlags.Public;
someType.GetProperties(flags);
Run Code Online (Sandbox Code Playgroud)