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)),这是有效的吗?