有没有办法检测类上泛型参数中指定的类型?
例如,我有以下三个类:
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();
答案 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
。