Получить содержащийся тип в List <T>через отражение? - PullRequest
11 голосов
/ 11 февраля 2009

Посредством размышления, могу ли я как-нибудь взглянуть на общий тип List, чтобы увидеть, к какому типу относится коллекция? Например:

У меня есть простой набор бизнес-объектов, производных от интерфейса, например:

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?

Псевдо закодировано (плохо), как это:

foreach(PropertyInfo info in typeof(BusinessEntity).GetProperties())
{
  if(info.PropertyType is GenericIList &&
     TheNestedTypeInThisList.IsAssignableFrom(IEntityBase)
  {
    return true;
  }
}

Единственный вариант, который я слышал до сих пор, который работает, это вытащить первый элемент из этого списка, а затем посмотреть на его тип. Более простой способ (особенно потому, что я не могу гарантировать, что список не будет пустым)?

Ответы [ 2 ]

27 голосов
/ 11 февраля 2009

Если у вас есть System.Type, который описывает ваш List<>, вы можете использовать метод Type.GetGenericArguments(), чтобы получить экземпляр Type, который описывает, что это список.

2 голосов
/ 11 февраля 2009

как то так?

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...