【问题标题】:Using GetProperties() with BindingFlags.DeclaredOnly in .NET Reflection在 .NET 反射中使用 GetProperties() 和 BindingFlags.DeclaredOnly
【发布时间】:2009-10-09 17:04:11
【问题描述】:

如果我使用

sometype.GetProperties();

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

但是,当我尝试这个时:

sometype.GetProperties(BindingFlags.DeclaredOnly);

我得到 0 个属性。

有人知道我做错了什么吗?

【问题讨论】:

  • To all who come from google: 如果您在设置标志后仍然无法获得“属性”,如果您是 c# 新手并且不知道 PropertiesFields 之间的区别,尝试使用GetFields()。您可能一直在寻找fields
  • @user1306322:为了记录,我“来自谷歌”,我的代码是:var types = type.GetFields.Select(f => f.FieldType).Union(type.GetProperties.Select(p => p.PropertyType)); - 结果仍然是 0。

标签: c# .net reflection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    总结一下:

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

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

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

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

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

    详情请见MSDN documentation for GetProperties(BindingFlags)

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

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

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

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

    【讨论】:

    • 所以要指出这一点:没有任何 BindingFlags,有一些默认值。你知道它们是什么吗?
    • 如果使用GetProperties() 重载(不带参数),您将获得所有公共属性。但是GetProperties(BindingFlags.Default) 会返回一个空数组。
    • 呵呵,那么 BindingFlags.Default 有什么用?! ;)
    • 建议所有标有 Flags 属性的枚举都为0 定义枚举值。由于枚举标志的基础类型是 int,因此您必须有一个表示 int 默认值的枚举。当您实例化它或对标志进行按位运算时,您可能会得到一个 0 值。
    • ➕1 包含该神秘枚举的详细信息
    【解决方案3】:

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

    我认为您真正要寻找的是以下内容

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

    【讨论】:

      【解决方案4】:

      来自MSDN 网站。

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

      您必须指定 Instance 或 Static 以及 Public 或 NonPublic 或 不会返回任何成员。

      因此,除非您指定绑定标志,否则您将一无所获。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-15
          相关资源
          最近更新 更多