2009-09-07 98 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遠程處理基礎結構來攔截方法調用。 (如果您的調用在同一個應用程序域內,但是跨越不同的「上下文」,則運行時開銷最小)。 所以更好的方法將是其他海報上面提到的方法。