#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. Спасибо. Это дает мне возможность начать. Я поиграю с вашим предложением и сразу вернусь!