28

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

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

某物在哪里obj

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

4

5 回答 5

29

用这个:

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

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

于 2008-10-28T22:27:34.487 回答
16

我觉得没那么复杂。

如果您将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
    我的财产
于 2008-10-28T22:32:41.420 回答
6

如果您访问Type.BaseType,您可以获得基本类型。您可以递归访问每种基本类型,并且当您的类型为System.Object.

Type type = obj.GetType();
PropertyInfo[] info = type.GetProperties(BindingFlags.Public);
PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public);
于 2008-10-28T22:22:50.613 回答
3

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

例如:

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

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

于 2008-10-28T22:43:29.807 回答
2

采用:

TypeDescriptor.GetProperties(obj);
于 2008-10-28T22:35:20.183 回答