反映具有约束条件的通用类型的所有可能排列

3

给定一个带有约束条件的通用类型:

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> 
编辑: 基于@rich.okelly的回答,我认为真正的问题是:

如何在运行时找到实现我的泛型类型约束的所有类型?

因此,如果给我 typeof(MyClass<>),我会得到上面的类型。

2个回答

4

类似于:

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)
{
    ...
}

如果你只有 MyClass 类型,你有什么想法? - Austin Salonen
更新alpha的运行时类型不再需要。 - Rich O'Kelly
@AustinSalonen的答案现已更新为完整解决方案(假设所有必需程序集都已加载)。 - Rich O'Kelly
非常符合我需要的!谢谢! - Austin Salonen
谢谢你,一直在寻找帮助我解决这个问题的东西 - http://stackoverflow.com/questions/16053665/c-sharp-generics-wrapper-generator。你的解决方案可能是一个好选择。 - Frank Tzanabetis

0

您可以枚举应用程序域中加载的所有程序集。然后枚举每个程序集中的所有类型,并测试每个类型是否是常量的子类


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接