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



我有一个通用列表:

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
}

我的列表充满了这些继承对象(Order, Customer,…)。我怎么能找到每个元素的所有属性(包括BaseEntity属性和继承属性)在list使用反射?

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

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

这是一个ideone的演示。GetProperties()生成类的所有公共属性的列表。您可以使用PropertyInfo变量p检查这些属性的名称和类型。您还可以通过调用var val = p.GetValue(e)来获取和设置属性本身。

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

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

每个PropertyInfo都携带许多信息,如PropertyName、PropertyType(即Getter返回的内容)和DefinedBy(即定义它的类——可以是这个类,也可以是被查询对象的任何基类)。

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

请注意,这实际上是查询列表中每个对象的属性。您将得到N个数组,其中包含类的各种属性,而不是对象。如果第5项是一个Foo,那么你将得到一个Foo类的propinfo数组。

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

只需对列表中的每一项使用此命令:

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

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

相关内容

  • 没有找到相关文章

最新更新