【问题标题】:Delegate.CreateDelegate vs DynamicMethod vs ExpressionDelegate.CreateDelegate vs DynamicMethod vs Expression
【发布时间】:2010-10-10 12:21:25
【问题描述】:

关于Making reflection fly and exploring delegates的问题...

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

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

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

【问题讨论】:

    标签: c# .net reflection dynamic delegates


    【解决方案1】:

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

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

    这有帮助吗?

    【讨论】:

    • 当您让动态方法发挥作用时,它们会动摇。让他们工作虽然通常涉及大量主演 IL、挫败感和与 peverify 的较量。但它们产生了令人敬畏的结果。
    • 这也证实了我的想法。在谷歌上搜索代表似乎很多人正在使用 DynamicMethod 来解决这个问题。我有一个应用程序,它以我描述的方式大量使用 Delegate.CreateDelegate。
    【解决方案2】:

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

    更新

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

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2011-09-18
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      相关资源
      最近更新 更多