2011-06-01 34 views
3

我有一个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中工作?我唯一认为atm是为近似泛型类型建立一个字符串。

回答

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); 
+0

完美。谢谢。 – 2011-06-01 12:53:55

0

我已经接受了马克的答案,这是因为它显然做到这一点在这种情况下,正确的方法。然而,在此期间,我制定了另一种解决方案,在其他情况下可能会很方便。

我的原始方法的问题与Func` {0}类型的名称未被限定为程序集引用有关。所以备用修复我发现了这个(错别字不耐受):

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

typeof(Func<>).Assembly是一个黑客获取到实现Func键类型集的引用。