Ответ 1
Предполагая, что у вас есть System.Type
, который описывает ваш List<>
, вы можете использовать метод Type.GetGenericArguments()
для получения экземпляра Type
, который описывает, что это список.
Через отражение, есть ли какой-то способ взглянуть на общий список, содержащий тип, чтобы узнать, какой тип имеет коллекция? Например:
У меня есть простой набор бизнес-объектов, которые выводятся из интерфейса, например:
public interface IEntityBase{}
public class BusinessEntity : IEntityBase
{
public IList<string> SomeStrings {get; set;}
public IList<ChildBusinessEntity> ChildEntities { get; set;}
}
public class ChildBusinessEntity : IEntityBase{}
В случае, когда я повторяю свойства BusinessEntity посредством отражения, будет ли у меня возможность увидеть, были ли объекты, вложенные внутри этих списков из IEntityBase?
Pseudo закодирован (плохо):
foreach(PropertyInfo info in typeof(BusinessEntity).GetProperties())
{
if(info.PropertyType is GenericIList &&
TheNestedTypeInThisList.IsAssignableFrom(IEntityBase)
{
return true;
}
}
Только тот вариант, который я слышал до сих пор, работает, - это вытащить первый элемент из этого списка, а затем посмотреть его тип. Любой более простой способ (особенно потому, что я не могу гарантировать, что List не будет пустым)?
Предполагая, что у вас есть System.Type
, который описывает ваш List<>
, вы можете использовать метод Type.GetGenericArguments()
для получения экземпляра Type
, который описывает, что это список.
что-то вроде этого?
foreach (System.Reflection.PropertyInfo info
in typeof(BusinessEntity).GetProperties())
{
if (info.PropertyType.IsGenericType &&
info.PropertyType.Name.StartsWith("IList") &&
info.PropertyType.GetGenericArguments().Length > 0 &&
info.PropertyType.GetGenericArguments()[0] == typeof(string)
)
{
return true;
}
}