【问题标题】:function decorators in c#c#中的函数装饰器
【发布时间】:2010-11-26 08:15:09
【问题描述】:

是否有 Python 的函数装饰器的 C# 类比?感觉使用属性和反射框架是可行的,但我没有看到在运行时替换函数的方法。

Python decorators 通常是这样工作的:

class decorator(obj):
    def __init__(self, f):
        self.f = f
    def __call__(self, *args, **kwargs):
        print "Before"
        self.f()
        print "After"

@decorator
def func1():
    print "Function 1"

@decorator
def func2():
    print "Function 2"

调用 func1 和 func2 会导致

前 功能一 后 前 功能二 后

这个想法是装饰器可以让我轻松地在多个函数的入口和出口处添加常用任务。

【问题讨论】:

  • 我发现这是一个关于为什么而不是什么的有趣介绍。 python.about.com/gi/dynamic/offsite.htm?zi=1/…
  • 嗯,我希望语言中已经内置了一些东西,但从答案看来,如果不添加新框架就没有直接的方法可以做到这一点。我的项目非常小,所以这样做可能有点矫枉过正。

标签: c# python reflection decorator


【解决方案1】:

我实现这一点的方法是通过AOP frameworksCastle Dynamic ProxySpring.NET 甚至Policy Injection Application Block

【讨论】:

  • 感谢 AOP 的指针 - 我认为在我的小项目中添加一个框架可能有点矫枉过正,至少对于我首先想要的装饰器。无论如何谢谢:)
【解决方案2】:

您可以使用Post Sharp 做到这一点。查看演示视频了解说明。

【讨论】:

  • Post Sharp 看起来非常棒,但是在我的小项目中添加一个框架对于我需要函数装饰器的功能来说可能有点矫枉过正。无论如何谢谢:D
  • 真的很简单,就是加个引用,继承一个属性。
  • 在 45 天试用期后还需支付 329 欧元。
  • @Magnus 有免费版
  • @Magnus 称他们的营销非常糟糕和令人困惑,这将给它过多的信任。另一方面,产品很棒。
【解决方案3】:

您可以通过 .NET 框架中的“ContextBoundObject”来实现这一点。 但这有点令人费解,因为它基本上使用 .net 远程处理基础设施来拦截方法调用。 (如果您的调用在同一个应用程序域内但只是跨不同的“上下文”,则运行时开销最小)。 所以更好的方法是上面提到的其他海报。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 2016-07-12
    • 2019-05-26
    • 2010-10-27
    • 2011-06-06
    • 2018-10-25
    • 2011-06-25
    相关资源
    最近更新 更多