使用反射查找通用列表元素的继承属性

时间:2013-05-29 09:41:50

标签: c# list generics reflection properties

我有一个通用列表:

IList<BaseEntity> list; //base entity is a public base class

我还有一些继承自BaseEntity的其他类:

public class Order:BaseEntity
{
    //Properties
}
public class Customer:BaseEntity
{
    //Properties
}
....
public class X:BaseEntity
{
    //Properties
}

我的列表中填充了这些继承的对象(OrderCustomer,...)。 如何使用反射在BaseEntity中找到每个元素的所有属性(包括list属性和继承的属性)?

3 个答案:

答案 0 :(得分:2)

您可以像这样获取每个对象的所有公共属性:

foreach (var e in list) {
    var type = e.GetType();
    Console.WriteLine("====== {0}", type.FullName);
    foreach (var p in type.GetProperties()) {
        Console.WriteLine(p);
    }
}

这是demo on ideoneGetProperties()生成您班级所有公共属性的列表。您可以使用PropertyInfo变量p检查这些属性的名称和类型。您也可以通过调用var val = p.GetValue(e)来获取和设置属性。

答案 1 :(得分:1)

.net世界中的每个对象都为您提供GetType方法,因此对于列表中的每个元素,您都可以询问它的属性集:

foreach(var item in list)
{
    var props = item.GetType().GetProperties();
    // props is a PropertyInfo[]
}

每个PropertyInfo都携带许多信息,如PropertyName,PropertyType(即Getter返回的内容)和DefinedBy(也就是说,哪个类定义了它 - 它可能是此类或被查询对象的任何基类)

GetProperties。默认情况下,它只返回公共属性,但考虑到你说'实体',这可能就是你想要的。但是,如果您还需要非公共属性,请参阅GetProperties(BindingFlags)

请注意,这实际上会查询列表中有关其自身属性的每个对象。您将获得各种属性的N个数组,而不是对象。如果第5项是Foo,那么你将得到一个PropInfos数组用于Foo类。

这不一定是最好的方法,因为很可能在列表中会重复对象类型。您可能希望首先扫描列表中的不同类型,然后每种类型只查询一次属性。

答案 2 :(得分:0)

只需对列表中的每个项目使用它:

item.GetType()。GetProperties()或GetProperties重载:

http://msdn.microsoft.com/en-us/library/system.type.getproperties.aspx