2

我有一个通用列表:

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

4

3 回答 3

2

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

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)

于 2013-05-29T09:49:53.967 回答
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,那么您将获得 Foo 类的 PropInfos 数组。

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

于 2013-05-29T09:50:55.673 回答
0

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

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

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

于 2013-05-29T09:51:23.723 回答