如何构造带动态类型参数的System.Func类型 解决非特化Func编译报错
你遇到的编译错误的核心原因是:.NET 基础类库中不存在无泛型参数的非泛型Func类型,而IEnumerator存在独立的非泛型实现,所以typeof(IEnumerator)是合法写法,typeof(Func)没有对应的类型定义,自然无法通过编译。
解决方法
你需要先获取对应参数数量的Func开放泛型类型定义(即未绑定具体类型的泛型原型),再调用MakeGenericType动态构造闭合类型。
你需要的是接收2个输入参数、返回1个int值的Func,对应3个泛型参数的开放泛型类型,修正后的代码如下:
Type tsomething = /* ... */ ; // 尖括号内2个逗号,代表这是有3个泛型参数的Func开放定义:Func<T1, T2, TResult> Type funcOpenGenericType = typeof(Func<,,>); Type comparer = funcOpenGenericType.MakeGenericType(new Type[]{tsomething, tsomething, int});
补充说明
- 不同参数数量的
Func对应不同的开放泛型写法:- 无输入仅返回值的
Func<TResult>:使用typeof(Func<>) - 1个输入参数的
Func<T, TResult>:使用typeof(Func<,>) - 以此类推,N个泛型参数的
Func,尖括号内填写N-1个逗号即可获取对应的开放泛型定义
- 无输入仅返回值的
- 这种方式拿到的开放泛型类型完全兼容 Reflection.Emit 场景,编译期不需要知道具体的参数类型,符合你的需求。
- 额外提示:你贴出的可运行的
IEnumerator代码属于特殊情况,IEnumerator是非泛型类型,实际上支持MakeGenericType调用的是泛型版本的IEnumerator<>,这是 BCL 中同时提供了泛型+非泛型实现的特殊接口,大部分泛型委托(比如Func、Action系列)都没有对应的非泛型实现,不能直接写不带尖括号的typeof。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

