【问题标题】:How to wrap a method via attributes?如何通过属性包装方法?
【发布时间】:2016-04-11 13:47:09
【问题描述】:

我想知道是否可以仅通过添加属性来包装方法。

示例:我想记录一个方法的执行时间。

[LogTimings]
public void work()
{
  ..
}

这是一种将方法包装到另一个方法中的方式 (see this python implementation)。

【问题讨论】:

    标签: c# attributes


    【解决方案1】:

    AOP 在 .NET 中是可能的。这是关于它的article。这是 .NET 的 list of AOP frameworks

    【讨论】:

    • 虽然这在理论上可以回答问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
    【解决方案2】:

    看看PostSharp,一个 .NET 的 AOP 框架。

    在日志记录和计时方面,还有一个名为Gibraltar 的框架与 PostSharp 集成,应该更容易收集和使用结果。我一直想尝试一下……

    【讨论】:

    • 我想知道这些框架是否都基于反射。此外,此处的 PostSharp.org 链接已更改为 postsharp.net
    • @matrixugly:修复了链接,但是不,您不能仅通过反射来完成所有这些工作 - 基本上,您需要重写 IL。
    • 这就是我收集到的。我不喜欢第 3 方(甚至我自己的)库在发出的代码中混入的想法。听起来 PostSharp 实际上会扫描 IL。我想知道这个的简单版本是否可以加载程序集并使用反射来发出 dll 的“AOP 化”版本。 (这样就不用扫描IL了?)
    • @matrixugly:好吧,它仍然需要查看 IL 才能发出 AOP 化的 IL……老实说,我不太确定反对意见是什么……
    • 不可以加载程序集,修改现有方法的表达式树,然后输出一个新的dll吗?这样一来,您就不会明确地查看 IL,而是让 Reflection 完成工作……对吗?
    【解决方案3】:

    仅使用标准 .NET 框架库,您必须通过从 System.Runtime.Remoting.Proxies.RealProxy 派生来创建包装功能。

    然后您可以将此功能应用于您的类,但该类必须派生自 System.MarshalByRefObject

    这是相当多的限制,这就是为什么您可能希望查看像 PostSharp 这样的 3rd 方组件。

    【讨论】:

      【解决方案4】:

      如果您使用PostSharp,则无需使用其他编译器即可完成此操作。

      【讨论】:

        【解决方案5】:

        我在 .Net 上写了一些关于 AOP 的东西: Help and Information about Aspect Oriented Programming

        【讨论】:

          猜你喜欢
          • 2012-12-02
          • 1970-01-01
          • 2015-01-15
          • 2014-05-30
          • 1970-01-01
          • 2018-05-20
          • 2020-12-24
          • 2023-03-28
          • 1970-01-01
          相关资源
          最近更新 更多