我想要几个使用表达式树动态创建的例程。似乎使用它们的最简单方法是创建
LambdaExpression
然后调用 LambdaExpression
。Compile()
产生可调用委托。
Compile()
都会发生这种情况吗?TypeBuilder
和 MethodBuilder
创建一个新类型并包含所有例程作为该类型的静态方法是否更好?有任何建议欢迎提出!
DynamicMethod
- 这是一个独立的方法,避免了 AssemblyBuiler
、ModuleBuilder
、TypeBuilder
等的所有常见权重,并且 just 提供对 ILGenerator
的原始访问static
风格的方法;然后代码遍历表达式树,通过 ILGenerator
发出适当的操作码;最后,在 CreateDelegate
上调用 DynamicMethod
DynamicMethod
试图避免这种情况DynamicMethod
可以做而 TypeBuilder
不能做(例如,可访问性跳过),有些事情 TypeBuilder
可以做而 DynamicMethod
不能做(实现接口、声明和使用字段等) );如果你不需要这些东西,Expression.Compile()
是避免学习低级ref-emit的一个很好的方法,这是很容易出错(无效的IL通常会杀死运行时)Expression
可以选择 spoof 发出,通过 AST 解释器实际运行,而不是在不允许引用的运行时发射; Compile()
返回此解释器的入口点,而不是动态编译方法的委托;如果您使用 TypeBuilder