我有一个通用列表:
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