我有一个通用列表:
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
属性和继承的属性)?
答案 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 ideone。 GetProperties()
生成您班级所有公共属性的列表。您可以使用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