如何从字符串中获取打开的泛型类型

本文关键字:泛型类型 获取 字符串 | 更新日期: 2023-09-27 17:58:13

我有一个Type[]数组,我想得到Func类型,其中T1、T2等…对应于数组中的类型。数组的大小不是固定的,但假设某个类型在运行时可用(.NET 4中为16,.NET 3.5中为4)

在.NET4中,我可以做到这一点,并且它可以工作:

Type GetFuncType(Type typeRet, Type[] types)
{
    return Type.GetType(string.Format("System.Func`{0}", types.Length + 1))
                  .MakeGenericType(types.Concat(new Type[] { typeRet } ).ToArray())
}

但是,在.NET 3.5中,打开泛型类型的Type.GetType失败,返回NULL。

有没有一种方法可以让它在.NET 3.5中运行?我唯一的想法是atm为close泛型类型建立一个字符串。

如何从字符串中获取打开的泛型类型

执行此操作的首选方法是使用Expression.GetFuncType(Type[])Expression.GetActionType(Type[])。在func的情况下,最后一个Type是返回,因此:
Array.Resize(ref types, (types == null ? 0 : types.Length) + 1);
types[types.Length - 1] = typeRet;
return Expression.GetFuncType(types);

我接受了Marc对此的回答,因为在这种情况下,这显然是正确的方法。然而,与此同时,我想出了另一个解决方案,在其他情况下可能会很方便。

我的原始方法的问题与Func"{0}"类型名称未使用程序集引用限定有关。所以我发现的另一个修复方法是(打字错误):

typeof(Func<>).Assembly.GetType(string.Format("Func`{0}", types.Length+1));

typeof(Func<>).Assembly是一种获取对实现Func类型的程序集的引用的方法。