Получить замкнутый тип в списке <T> через отражение?

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

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

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 не будет пустым)?

Ответ 1

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

Ответ 2

что-то вроде этого?

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;
    }
}