我有一个Type []数组,我想获得Func类型,其中T1,T2等...对应于数组中的类型。该数组的大小不固定,但假设运行时中有一个类型(.NET 4中有16个,.NET 3.5中有4个)。
在.NET 4中,我可以做到这一点并且有效:
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中使用它?我唯一想到的是为close类型建立一个字符串。
答案 0 :(得分:4)
执行此操作的首选方法是使用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);
答案 1 :(得分:0)
我接受了Marc对此的回答,因为在这种情况下,这显然是正确的做法。然而,与此同时,我制定了另一种解决方案,在其他情况下可能很方便。
我原来方法的问题与Func` {0}类型名称没有用程序集引用限定。所以我发现的替代修复是这样的(错别字):
typeof(Func<>).Assembly.GetType(string.Format("Func`{0}", types.Length+1));
typeof(Func<>).Assembly
是一个hack来获取对实现Func类型的程序集的引用。