0

有什么方法可以检测类的泛型参数中指定的类型?

例如,我有以下三个类:

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();
4

2 回答 2

2

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

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

编辑:您不需要100%信任Re-Sharper。既然Where选择了所有不是的类型,BaseTypenull不用再签入了Select。更多,FirstOrDefault实际上是 return null,这段代码被优化了:

 Assembly.GetAssembly(typeof(Repository<>))
                  .GetTypes()
                  .Where(x => x.BaseType != null)
                  .Select(x => x.BaseType.GetGenericArguments().FirstOrDefault())
                  .ToList();
于 2012-09-17T16:36:29.283 回答
1

尝试使用GetGenericArguments.

于 2012-09-17T15:58:02.977 回答