2009-09-07 8 views
22

Gibt es ein C# -Analog für Python-Funktion Dekoratoren? Es fühlt sich an, als wäre es mit Attributen und dem Reflektionsrahmen machbar, aber ich sehe keine Möglichkeit, Funktionen zur Laufzeit zu ersetzen.Funktion Dekorierer in C#

Python decorators arbeiten in der Regel auf diese Weise:

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" 

Aufruf func1 und func2 würde dann in

 
Before 
Function 1 
After 
Before 
Function 2 
After 

Die Idee ist, dass Dekorateure lassen mich einfach gemeinsame Aufgaben an den Ein- und Ausstiegspunkte hinzufügen von mehreren Funktionen.

+0

Ich fand dies ein interessantes Intro in das Warum im Gegensatz zu dem was. 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, ich hoffte auf etwas, das bereits in die Sprache integriert ist, aber aus den Antworten, die es zu sehen gibt, gibt es keinen direkten Weg ohne ein neues Framework hinzuzufügen. Mein Projekt ist sehr klein, also ist es wahrscheinlich zu viel Aufwand, es auf diese Weise zu tun. – jtjin

Antwort

9

Sie können das mit Post Sharp tun. Sehen Sie sich das Demo-Video an, um Anweisungen zu erhalten.

+1

Post Sharp sieht ziemlich toll aus, aber das Hinzufügen eines Frameworks zu meinem kleinen Projekt könnte etwas übertrieben sein für das, wofür ich die Funktion Decorators benötigt habe. Danke trotzdem: D – jtjin

+0

Es ist wirklich einfach, nur einen Verweis hinzufügen und ein Attribut erben. –

+0

Es kostet auch 329 Euro nach der 45-tägigen Testphase. – Magnus

4

können Sie dies durch "ContextBoundObject" im .NET Framework erreichen. aber es ist ein bisschen verschachtelt, weil es im Wesentlichen .net Remoting-Infrastruktur verwendet, um Methodenaufrufe abzufangen. (Der Laufzeit-Overhead ist minimal, wenn sich Ihre Anrufe innerhalb derselben App-Domäne befinden, aber nur über verschiedene "Kontexte" hinweg). so wären die besseren Ansätze die oben genannten von den anderen Plakaten.