2009-09-07 17 views
22

Czy istnieje analog C# dla dekoratorów funkcji Pythona? Wydaje się, że jest to możliwe dzięki atrybutom i strukturze refleksji, ale nie widzę sposobu na zastąpienie funkcji w czasie wykonywania.funkcja dekoratorów wC#

Python decorators generalnie działa w ten sposób:

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" 

Wywołanie func1 i func2 by następnie doprowadzić

 
Before 
Function 1 
After 
Before 
Function 2 
After 

Chodzi o to, że dekoratorzy pozwoli mi łatwo dodać typowych zadań na punktach wejścia i wyjścia wielu funkcji.

+0

Znalazłem to interesujące wprowadzenie do tego, dlaczego w przeciwieństwie do tego, co. 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

+0

Hmm, liczyłem na coś, co już zostało wbudowane w język, ale z odpowiedzi wynika, że ​​nie ma prostego sposobu na zrobienie tego. bez dodawania nowej struktury. Mój projekt jest bardzo mały, więc prawdopodobnie jest to przesadą. – jtjin

Odpowiedz

9

Możesz to zrobić, używając Post Sharp. Sprawdź film demonstracyjny, aby uzyskać instrukcje.

+1

Post Sharp wygląda całkiem nieźle, ale dodanie struktury do mojego małego projektu może być nieco przesadzone, ponieważ potrzebowałem dekoratorów funkcji. Dzięki i tak: D – jtjin

+0

To naprawdę proste, wystarczy dodać odwołanie i dziedziczyć atrybut. –

+0

Kosztuje również 329 EUR po 45-dniowym okresie próbnym. – Magnus

4

można to osiągnąć poprzez "ContextBoundObject" w środowisku .NET Framework. , ale jest nieco zawiłe, ponieważ w zasadzie wykorzystuje infrastrukturę sieci .net do przechwytywania wywołań metod. (Obciążenie środowiska wykonawczego jest minimalne, jeśli połączenia są w tej samej domenie aplikacji, ale w różnych "kontekście"). , więc lepszym podejściem będą te wspomniane powyżej przez inne plakaty.