C# 使用反射识别类的泛型类型

C# 使用反射识别类的泛型类型,c#,reflection,C#,Reflection,有没有办法检测类的泛型参数中指定的类型 例如,我有以下三个类: public class Customer { } public class Repository<T> { } public class CustomerRepository : Repository<Customer> { } public class Program { public void Example() { var types = Assembly.Get

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

例如,我有以下三个类:

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)
    }
} 
公共类客户
{ }
公共类存储库
{ }
公共类CustomerRepository:存储库
{ }
公共课程
{
公共无效示例()
{
var types=Assembly.GetAssembly(typeof(Repository)).GetTypes();
//类型包含存储库和CustomerRepository
//对于CustomerRepository,我想提取泛型(在本例中为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();

尝试使用。

尝试使用。

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

var customerType = typeof(CustomerRepository).BaseType
                          .GetGenericArguments().First();
编辑:您不需要100%信任Re Sharper。由于要选择其
BaseType
不是
null
的所有类型,不需要在
select
中再次检查。有关更多信息,
FirstOrDefault
实际返回
null
,此代码经过优化:

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

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

var customerType = typeof(CustomerRepository).BaseType
                          .GetGenericArguments().First();
编辑:您不需要100%信任Re Sharper。由于要选择其
BaseType
不是
null
的所有类型,不需要在
select
中再次检查。有关更多信息,
FirstOrDefault
实际返回
null
,此代码经过优化:

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

试过了,结果返回Name=T。。。。不是我所期望的“客户”类型?请详细说明您调用的是哪种类型。@alexjamesbrown-我的意思是您调用的是什么
GetGenericArguments
on?尝试过了,只返回Name=T。。。。不是我所期望的“客户”类型?请详细说明您调用的是哪种类型。@alexjamesbrown-我的意思是您调用的
GetGenericaArguments
是什么?如果您提供了有效的c#,将更容易提供帮助。第三个类虽然有效,但您的意思是类似于
公共类CustomerRepository:Repository
?var repositories=Assembly.GetAssembly(typeof(Repository))这是有效的吗?如果您提供了有效的c#,会更容易提供帮助。第三个类虽然有效,但您的意思是类似于
公共类CustomerRepository:Repository
?var repositories=Assembly.GetAssembly(typeof(Repository)),这是有效的吗?