Delegate.CreateDelegate与DynamicMethod vs Expression

关于使反思飞行和探索代表的问题 ……

如果我需要为动态加载类型的方法创建委托Func ,我可能会使用(1) Delegate.CreateDelegate (2) DynamicMethod (3) Expression树。

让我们说一组动态加载的类型/方法在应用程序启动时通过config反映一次,并在应用程序的整个生命周期中使用(启动性能不是问题,也不是内存),代理被缓存并分派到一个强烈的方式。 这些代理是同时访问的热路径。

您更喜欢哪种动态绑定方法?为什么?

如果他们实际上是你有一个MethodInfo现有方法,并且他们有正确的签名,那么我会说Delegate.CreateDelegate是正确的方法 – 它完全符合你的要求,没有大惊小怪。 如果我需要构建一个委托来执行一些尚未在方法中捕获的逻辑,我会使用DynamicMethod或表达式树。

表达树是(IMO,我没有使用DynamicMethod愤怒)比DynamicMethod更容易使用,但它们受到更多限制 – 基本上它们只能代表一个表达式(当然可以调用另一个方法)。 DynamicMethod为您提供了很大的灵活性,但您需要合理地理解IL。

这有帮助吗?

通过Ayende的博客,我得到了这个有趣的链接,展示了你可以用动态方法做的事情。 作为一个例子,这是可以理解的:
使用Generic EnumComparer加速基于枚举的词典

更新

应该注意的是,在WinRT的世界中, Reflection.Emit是不可用的 – 一些信息可以在这里找到