Delegate.CreateDelegate与DynamicMethod vs Expression

时间:2009-02-28 10:09:45

标签: c# .net reflection dynamic delegates

有关Making reflection fly and exploring delegates ...

的问题

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

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

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

2 个答案:

答案 0 :(得分:23)

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

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

这有帮助吗?

答案 1 :(得分:5)

通过Ayende的博客我得到了这个有趣的链接,展示了你可以用动态方法做的事情。举个例子,这是可以理解的:
Accelerating Enum-Based Dictionaries with Generic EnumComparer

<强>更新

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