通过反射获取List <t>中包含的类型?</t>

时间:2009-02-11 18:24:05

标签: c# .net generics reflection

通过反思,我可以通过某种方式查看通用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;
  }
}

到目前为止,我所听到的唯一选择是从该列表中取出第一个项目,然后查看其类型。任何更简单的方法(特别是因为我无法保证List不会为空)?

2 个答案:

答案 0 :(得分:27)

假设您拥有描述System.Type List<>的{​​{1}},您可以使用Type.GetGenericArguments()方法获取描述其列表的Type实例。

答案 1 :(得分: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;
    }
}