生成具有多种类型的泛型
本文关键字:类型 泛型 种类 | 更新日期: 2023-09-27 17:58:30
我有一块代码,有时我需要在其中创建一个新的泛型类型,但有未知数量的泛型参数。例如:
public object MakeGenericAction(Type[] types)
{
return typeof(Action<>).MakeGenericType(paramTypes);
}
问题是,如果我的数组中有多个Type,那么程序就会崩溃。在短期内,我想出了这样的办法作为权宜之计。
public object MakeGenericAction(Type[] types)
{
if (types.Length == 1)
{
return typeof(Action<>).MakeGenericType(paramTypes);
}
else if (types.Length ==2)
{
return typeof(Action<,>).MakeGenericType(paramTypes);
}
..... And so on....
}
这确实有效,而且很容易涵盖我的场景,但似乎真的很难。有更好的方法来处理这个问题吗?
在这种情况下,是:
Type actionType = Expression.GetActionType(types);
但这里的问题是,您可能会使用DynamicInvoke,这很慢。
然后通过索引访问的Action<object[]>
可能优于使用DynamicInvoke调用的Action<...>
Assembly asm = typeof(Action<>).Assembly;
Dictionary<int, Type> actions = new Dictionary<int, Type>;
foreach (Type action in asm.GetTypes())
if (action.Name == "Action" && action.IsGenericType)
actions.Add(action.GetGenericArguments().Lenght, action)
然后您可以使用actions
字典快速找到正确的类型:
public Type MakeGenericAction(Type[] types)
{
return actions[types.Lenght].MakeGenericType(paramTypes);
}