制作具有多种类型的泛型

时间:2011-06-07 17:05:34

标签: c# generics

我有一大堆代码,有时候我需要创建一个新的泛型类型,但是有一些未知的泛型参数。例如:

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

这确实有效,并且很容易涵盖我的场景,但它看起来真的很糟糕。有没有更好的方法来解决这个问题?

2 个答案:

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