反映具有约束条件的泛型类型的所有可能排列组合 [英] Reflect all possible permutations of a generic type with constraints

查看:107
本文介绍了反映具有约束条件的泛型类型的所有可能排列组合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定一个带约束的泛型:

  class MyClass< T>其中T:Alpha 
{
}

以及该约束的实现:

  class Alpha {} 
class Bravo:Alpha {} $ b $ class Charlie:Alpha {}

在运行时如何获得所有组合的泛型?

  //我在运行时需要这些类型
MyClass< Alpha>
MyClass< Bravo>
MyClass< Charlie>

编辑:基于@ rich.okelly的回答,我认为真实问题是这样的:



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



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

解决方案

类似于:

  var alphaType = typeof(Alpha); 
var allTypes = AppDomain.CurrentDomain.GetAssemblies()。SelectMany(a => a.GetTypes())。其中(t => alphaType.IsAssignableFrom(t));
var myClass = typeof(MyClass<>);
foreach(所有类型中的var类型)
{
var genericType = myClass.MakeGenericType(type);
}

另外,如果泛型类型已经被加载:

  var allTypes = AppDomain.CurrentDomain.GetAssemblies()。SelectMany(a => a.GetTypes())。其中(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类型)
{
...
}


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.

解决方案

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

这篇关于反映具有约束条件的泛型类型的所有可能排列组合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆