Delegate.CreateDelegate与DynamicMethod vs Expression

jsw*_*jsw 23 .net c# reflection delegates dynamic

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

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

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

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

Jon*_*eet 23

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

表达树是(IMO,我没有用过DynamicMethod愤怒)稍微容易使用DynamicMethod,但它们更受限制 - 基本上它们只能代表一个表达式(当然可以调用另一种方法).DynamicMethod给你很大的灵活性,但你需要合理地理解IL.

这有帮助吗?

  • 当你让他们工作时,动态方法摇摆不定.让他们工作虽然经常涉及很多主演IL,挫折和与peverify的比赛.但它们产生了令人敬畏的结果. (5认同)

flq*_*flq 5

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

更新

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