使用反射识别泛型类

时间:2012-09-17 15:54:45

标签: c# reflection

有没有办法检测类上泛型参数中指定的类型?

例如,我有以下三个类:

public class Customer
{ }

public class Repository<T>
{ }

public class CustomerRepository : Repository<Customer>
{ }

public class Program
{
    public void Example()
    {
        var types = Assembly.GetAssembly(typeof(Repository<>)).GetTypes();
        //types contains Repository, and CustomerRepository
        //for CustomerRepository, I want to extract the generic (in this case, Customer)
    }
} 

对于每个带回来的存储库对象,我希望能够告诉指定的类型 这可能吗?

修改

感谢@CuongLe,得到了这个有效,但看起来很乱.... (也来自resharper的帮助;))

var types = Assembly.GetAssembly(typeof(Repository<>))
 .GetTypes()
 .Where(x => x.BaseType != null && x.BaseType.GetGenericArguments().FirstOrDefault() != null)
 .Select(x => x.BaseType != null ? x.BaseType.GetGenericArguments().FirstOrDefault() : null)
 .ToList();

2 个答案:

答案 0 :(得分:2)

假设您现在通过从类型列表中选择来保持CustomerRepository的类型:

var customerType = typeof(CustomerRepository).BaseType
                          .GetGenericArguments().First();

修改:您无需信任重新锐化100%。由于您Where选择了BaseType不是null的所有类型,因此无需再次在Select中进行检查。有关更多信息,FirstOrDefault实际返回null,则此代码已经过优化:

 Assembly.GetAssembly(typeof(Repository<>))
                  .GetTypes()
                  .Where(x => x.BaseType != null)
                  .Select(x => x.BaseType.GetGenericArguments().FirstOrDefault())
                  .ToList();

答案 1 :(得分:1)

尝试使用GetGenericArguments