【问题标题】:How do you get the all properties of a class and its base classes (up the hierarchy) with Reflection? (C#)您如何使用反射获得一个类及其基类(向上层次结构)的所有属性? (C#)
【发布时间】:2008-10-28 22:08:21
【问题描述】:

所以我现在拥有的是这样的:

PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public);

obj 是某个对象。

问题是我想要的一些属性不在obj.GetType() 中,它们在更进一步的基类之一中。如果我停止调试器并查看 obj,我必须挖掘一些“基础”条目才能查看我想要获取的属性。是否可以设置一些绑定标志让它返回这些标志,还是我必须递归地挖掘Type.BaseType 层次结构并对所有这些标志执行GetProperties

【问题讨论】:

    标签: c# reflection getproperties


    【解决方案1】:

    使用这个:

    PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
    

    编辑:当然正确答案是Jay。不带参数的GetProperties() 等价于GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static )BindingFlags.FlattenHierarchy 在这里不起作用。

    【讨论】:

    • 我将其标记为答案,因为尽管 Jay 的作品有效并且可以得到我想要的东西,但这解释了它为什么有效。我只是假设,如果既没有指定 Instance 也没有指定 Static,它将默认为两者,而实际上它都没有返回。
    • 我正在查看的对象中没有顶级属性,所以我认为它只是在尝试检索顶级属性时它什么也没返回,而实际上它什么也没返回,因为它是试图获取既不是静态也不是实例的属性。
    • 我有一个带有一些非公共字段的基类,当我调用 .GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) 时,它返回非公共字段,当我对孩子做,它只返回公共字段/子字段,(子只包含公共字段,父包含由系统设置的字段,所以它是私有的)
    【解决方案2】:

    我觉得没那么复杂。

    如果您将 BindingFlags 参数删除到 GetProperties,我认为您会得到您正在寻找的结果:

        class B
        {
            public int MyProperty { get; set; }
        }
    
        class C : B
        {
            public string MyProperty2 { get; set; }
        }
    
        static void Main(string[] args)
        {
            PropertyInfo[] info = new C().GetType().GetProperties();
            foreach (var pi in info)
            {
                Console.WriteLine(pi.Name);
            }
        }
    

    生产

    我的属性 2 我的财产

    【讨论】:

      【解决方案3】:

      如果你访问Type.BaseType,你可以获得基本类型。您可以递归访问每个基本类型,当您的类型为 System.Object 时,您就会知道何时触底。

      Type type = obj.GetType();
      PropertyInfo[] info = type.GetProperties(BindingFlags.Public);
      PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public);
      

      【讨论】:

      • 爱你,伙计。好一个。为什么人们投了反对票?
      • 酷!谢谢你。为基类中的静态成员节省了一天。
      【解决方案4】:

      我倾向于同意 Nicolas 的观点;除非您知道需要反射,否则ComponentModel 是一个可行的替代方案,其优点是即使对于运行时模型(例如DataView/DataRowView),您也可以获得正确的元数据。

      例如:

          foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
          {
              Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
          }
      

      顺便说一句,你也可以用这个做一些简单的performance tricks;你可以对反射和Delegate.CreateDelegate做同样的事情,但是没有集中的地方来隐藏逻辑,不像TypeDescriptorTypeDescriptionProvider(如果这些不熟悉,不要担心;你可以使用代码“原样”;-p)。

      【讨论】:

        【解决方案5】:

        用途:

        TypeDescriptor.GetProperties(obj);
        

        【讨论】:

          猜你喜欢
          • 2010-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多