2009-09-07 94 views
22

是否有Python的函数装饰器的C#模拟器?感觉它可以通过属性和反射框架来实现,但我没有看到在运行时替换函数的方法。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会导致

 
Before 
Function 1 
After 
Before 
Function 2 
After 

的想法是,装饰会让我轻松地在入口点和出口点添加常见任务的多种功能。

+0

我发现这是一个有趣的介绍为什么,而不是什么。 http://python.about.com/gi/dynamic/offsite.htm?zi=1/XJ&sdn=python&cdn=compute&tm=12&f=10&su=p284.9.336.ip_p504.1.336.ip_&tt=29&bt=0&bts=1&zu=http %3A // www.python.org/doc/ 2.4.4/whatsnew/node6.html – ShuggyCoUk 2009-09-07 22:32:26

+0

嗯,我希望已经内置到语言的东西,但从答案看来,没有直接的方法可以做它不需要添加新的框架。我的项目非常小,所以这样做可能矫枉过正。 – jtjin 2009-09-07 23:15:54

回答

9

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

+1

张贴夏普看起来很棒,但添加一个框架到我的小项目可能有点矫枉过正,因为我需要的功能修饰器。无论如何感谢:D – jtjin 2009-09-07 23:10:01

+0

它非常简单,只需添加一个引用并继承一个属性即可。 – 2009-09-08 01:06:40

+0

在45天的试用期后,它也花费329欧元。 – Magnus 2014-08-22 12:19:00

4

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