2016-06-28 2 views
2

Если у меня есть коллекция данного субъекта, я могу получить свойство объекта следующим образом:Получение свойств в дочерних классах в IEnumerable базового класса

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(); 

Есть ли способ получить типы предметов в коллекции, даже если коллекция объявлена ​​с использованием базового класса?

+0

вы должны получить тип из фактических значений коллекции итерации, а не компиляция времени. –

+0

Что делать, если в списке есть объекты разных типов? Зачем вам нужны свойства? –

ответ

3

Это потому, что вы получение свойств от типа, представленного параметр типа T, который Foo и Foo имеет только One свойство.

Чтобы получить все возможные свойства, вы должны пройти через типы всех объектов в списке, как это:

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

Большое спасибо. Это то, что я искал; Я ценю вашу помощь. –

Смежные вопросы