当前位置:  开发笔记 > 编程语言 > 正文

Delegate.CreateDelegate与DynamicMethod vs Expression

如何解决《Delegate.CreateDelegate与DynamicMethodvsExpression》经验,为你挑选了2个好方法。

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

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

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

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



1> Jon Skeet..:

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

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

这有帮助吗?


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

2> flq..:

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

更新

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

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有