给定具有约束的泛型类型:
class MyClass<T> where T: Alpha
{
}
和该约束的实现:
class Alpha {}
class Bravo : Alpha {}
class Charlie : Alpha {}
如何在运行时获得所有组合的泛型类型?
// I want these types at run-time
MyClass<Alpha>
MyClass<Bravo>
MyClass<Charlie>
EDIT:基于@rich。凯利的回答,我认为真正的问题是这样的:
如何在运行时找到实现泛型类型约束的所有类型?
如果给定typeof(MyClass<>)
,我得到上面的类型
类似于
var alphaType = typeof(Alpha);
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(t => alphaType.IsAssignableFrom(t));
var myClass = typeof(MyClass<>);
foreach (var type in allTypes)
{
var genericType = myClass.MakeGenericType(type);
}
或者,如果泛型类型已经加载:
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(MyClass<>));
foreach (var type in allTypes)
{
...
}
您可以使用GetGenericArguments()
方法和GetGenericParameterConstraints()
方法来获得所需的类型。
var myType = typeof(MyClass<>);
var typeConstraints = myType.GetGenericArguments().First().GetGenericParameterConstraints();
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes());
var genericTypes = allTypes.Where(t => typeConstraints.All(tc => tc.IsAssignableFrom(t))).Select(t => myType.MakeGenericType(t));
foreach (var type in genericTypes)
{
...
}
你可以列举app域中所有加载的程序集。然后枚举每个程序集中的所有类型,并测试是否每个类型都是常量的子类。