繁体   English   中英

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

[英]How to get an open generic type from a string

我有一个 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 是为 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 类型的程序集的引用的技巧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM