我有一个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类型的程序集的引用的方法。