反映具有约束的泛型类型的所有可能排列



给定具有约束的泛型类型:

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域中所有加载的程序集。然后枚举每个程序集中的所有类型,并测试是否每个类型都是常量的子类。

相关内容

  • 没有找到相关文章

最新更新