我有一大堆代码,有时候我需要创建一个新的泛型类型,但是有一些未知的泛型参数。例如:
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....
}
这确实有效,并且很容易涵盖我的场景,但它看起来真的很糟糕。有没有更好的方法来解决这个问题?
答案 0 :(得分:5)
在这种情况下,是的:
Type actionType = Expression.GetActionType(types);
这里的问题是你可能会使用速度很慢的DynamicInvoke。
Action<object[]>
然后按索引访问可能会胜过使用DynamicInvoke调用的Action<...>
答案 1 :(得分:0)
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);
}