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

发布于 2024-12-17 10:55:36 字数 505 浏览 1 评论 0原文

给定一个带有约束的泛型类型:

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<>),我就会得到上面的类型。

Given a generic type with constraints:

class MyClass<T> where T: Alpha
{
}

and implementations of that constraint:

class Alpha {}
class Bravo : Alpha {}
class Charlie : Alpha {}

How can get generic types for all the combinations at run-time?

// I want these types at run-time
MyClass<Alpha> 
MyClass<Bravo> 
MyClass<Charlie> 

EDIT: Based on @rich.okelly's answer, I think the real question is this:

How can I find all the types that implement my generic type's constraint at run-time?

So if I'm given typeof(MyClass<>), I get the types above.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

祁梦 2024-12-24 10:55:36

例如:

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

Something like:

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);
}

Alternatively, if the generic types have already been loaded:

var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(MyClass<>));
foreach (var type in allTypes) 
{
  ...
}

Update

You can use the GetGenericArguments() method and the GetGenericParameterConstraints() method to get the required types.

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)
{
    ...
}
薆情海 2024-12-24 10:55:36

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

You can enumerate all loaded assemblies in the app domain. And then enumerate all the types in each Assembly and test to see if each type is a subclass of the constant.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文