生成具有多种类型的泛型

本文关键字:类型 泛型 种类 | 更新日期: 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);
}