如何通过反射创建Func<dynamic, object>类型以适配泛型方法Foo<T>
解决反射创建
Func<dynamic, object>类型的问题 答案是肯定的,但你得先抓住一个核心细节:在CLR运行时层面,dynamic根本不是独立类型——它只是object的编译时语法糖。所以你不需要找什么特殊的「dynamic类型」,直接用typeof(object)替代就行。
具体实现代码
你要的Func<dynamic, object>的反射类型表示,本质就是Func<object, object>,代码写法如下:
Type funcOpenType = typeof(Func<,>); Type funcDynamicObjectType = funcOpenType.MakeGenericType(typeof(object), typeof(object));
为什么这可行?
C#的dynamic关键字只是给编译器发信号:「跳过静态类型检查,运行时再处理这个对象的调用逻辑」。但编译完成后,所有标注dynamic的变量都会被编译成object类型,额外的动态调用逻辑会通过CLR的动态特性(比如DynamicInvoke)实现。
从反射视角看,Func<dynamic, object>和Func<object, object>在CLR中是完全相同的类型。当你把这个类型传给Foo<T>的泛型方法时,运行时根本区分不出你用的是dynamic还是object——因为它们本来就是一回事。
额外注意事项
如果你的委托逻辑依赖了dynamic的编译时动态解析(比如直接调用dynamic对象的方法而不用显式转换),那在反射场景下,你需要自己构建带有动态调用逻辑的委托(比如通过Expression树或Delegate.CreateDelegate结合动态调用)。但单纯从类型匹配的角度来说,用typeof(object)替代dynamic完全符合要求。
内容的提问来源于stack exchange,提问作者McGuireV10
相关产品推荐
相关产品推荐

