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

时间:2009-10-09 17:04:11

标签: c# .net reflection

如果我使用

sometype.GetProperties();

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

然而,当我尝试这个时:

sometype.GetProperties(BindingFlags.DeclaredOnly);

我得到0个属性。

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

5 个答案:

答案 0 :(得分:79)

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

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

答案 1 :(得分:44)

总结:

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

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

    • BindingFlags.Instance / BindingFlags.Static(实例与静态属性),
    • BindingFlags.Public / BindingFlags.NonPublic(公共与非公共财产)。
  3. 例如,要获取公共静态属性,您需要调用GetProperties(BindingFlags.Public | BindingFlags.Static)才能获得结果。仅呼叫GetProperties(BindingFlags.Public)GetProperties(BindingFlags.Static)不会返回任何结果。

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

    详情请见MSDN documentation for GetProperties(BindingFlags)

      

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

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

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

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

答案 2 :(得分:15)

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

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

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

答案 3 :(得分:0)

来自MSDN网站。

  

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

     

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

因此除非你指定绑定标志,否则什么也得不到。

答案 4 :(得分:-1)

我在使用typeof(Thing)时遇到了问题,最终这对我有用:

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