获取IEnumerable基类中的子类中的属性

时间:2016-06-28 21:41:08

标签: c# reflection

如果我有一个给定实体的集合,我可以像这样获取实体的属性:

var myCollection = new List<Foo>(); 
entities.GetType().GetGenericArguments()[0].GetProperties().Dump();

但是,如果我的集合是基类的IEnumerable并且使用派生类填充,那么列出属性会遇到一些困难。

public class Foo
{
    public string One {get;set;}
}

public class Bar : Foo
{
    public string Hello {get;set;}
    public string World {get;set;}
}

// "Hello", "World", and "One" contained in the PropertyInfo[] collection
var barCollection = new List<Bar>() { new Bar() };
barCollection.GetType().GetGenericArguments()[0].GetProperties().Dump();

// Only "One" exists in the PropertyInfo[] collection
var fooCollection = new List<Foo>() { new Bar() };
fooCollection.GetType().GetGenericArguments()[0].GetProperties().Dump();

即使使用基类声明集合,有没有获取集合中项目的类型?

1 个答案:

答案 0 :(得分:3)

这是因为您从类型参数T表示的类型中获取属性Foo,而Foo只有One属性。

要获取所有可能的属性,您需要查看列表中所有对象的类型,如下所示:

var allProperties = fooCollection
    .Select(x => x.GetType())
    .Distinct()
    .SelectMany(t => t.GetProperties())
    .ToList();