Как получить все перечислимые свойства определенного типа из класса

#c# #reflection

#c# #отражение

Вопрос:

Допустим, у меня есть класс poco, который выглядит следующим образом:

 public MyClass
{
    public IAssimilator p1 {get; set;}
    public IAssimilator p2 {get; set;}
    public IAssimilator p3 {get; set;}
    public string n1 {get; set;}

    public List<IAssimilator> p4 {get; set;}
    public IEnumerable<IAssimilator> p5 {get; set;}
    public List<int> n2 {get; set;}
}
  

У меня есть метод в другом месте, который возвращает List список всех свойств MyClass, имеющих тип IAssimilator . Это выглядит так:

 private List<IAssimilator> GetAssimilatorsOnClass(MyClass myInstance)
{
    return typeof(MyClass).GetProperties()
                .Where(p => p.PropertyType == typeof(IAssimilator))
                .Select(p => p.GetValue(myInstance) as IAssimilator)
                .ToList();
}
  

Он вернет a List<IAssimilator> , который содержит значения от p1 до p3.

Что я хотел бы добавить, так это то, что позволяет также получать значения IAssimilator внутри любого перечислимого свойства. В этом случае он должен возвращать список, содержащий значения в p4 и p5, но не n2. Я действительно не знаю, с чего начать.

Ответ №1:

Итак, вы хотите отфильтровать все свойства, имеющие тип, который является IEnumerable<IAssimilator> или производным от IEnumerable<IAssimilator> него. Вы можете сделать это аналогично тому, что вы уже сделали:

 private IEnumerable<IEnumerable<IAssimilator>> GetAssimilatorListsOnClass(MyClass myInstance)
{
    typeof(MyClass)
        .GetProperties()
        .Where(p => typeof(IEnumerable<IAssimilator>).IsAssignableFrom(p.PropertyType))
        .Select(p => p.GetValue(myInstance))
        .Cast<IEnumerable<IAssimilator>>();
}
  

Комментарии:

1. Спасибо. Это дает мне возможность начать. Я поиграю с вашим предложением и сразу вернусь!