2010-12-30 4 views
4

Ich habe eine Methode, die ich immer vor dem Zugriff auf eine Eigenschaft ausführen möchten. Ist dies möglich, ohne die Methode innerhalb der get {} manuell auszuführen? Hier ist ein Beispiel für das, was ich arbeiten möchte.C# Führen Sie ein Stück Code, bevor die Eigenschaften getroffen werden

private string _someString; 
    private string _someOtherString; 

    public string SomeString 
    { 
     get { return _someString; } 
    } 

    public string SomeOtherString 
    { 
     get { return _someOtherString; } 
    } 

    public void AlwaysRun() 
    { 
     // Code to always run here. 
    } 
+0

mögliche Duplikate von [Wie injiziere Methode zu Auto-Eigenschaft in .Net Framework] (http://stackoverflow.com/questions/4546935/how-to-inject-method-to-auto-property-in-net- Framework) –

Antwort

5

Dies ist nativ im .NET Framework nicht möglich.

Aber es kann mit einer Technik namens AOP, Aspect-oriented Programmierung getan werden. Es gibt eine gute Erklärung hier: http://www.sharpcrafters.com/aop.net. Bei AOP geht es darum, Code vor oder nach einem Methodenaufruf zu injizieren. was du machen willst. Dazu gibt es 2 Möglichkeiten: Zur Laufzeit oder zur Kompilierzeit. Der Laufzeitmodus generiert die Implementierung dynamisch durch Überschreiben virtueller Methoden. Daher müssen Ihre Methoden virtuell sein. Wenn es Zeit kompiliert, wird der tatsächliche Code (oder IL) geändert.

Eine schöne Kompilierzeit AOP-Framework ist PostSharp. Zum Ausführen von Laufzeit-AOP könnte ein Beispiel für ein Framework Castle DynamicProxy sein.

+0

+1 Das ist * sehr * interessant, ich habe noch nie davon gehört! – Mehrdad

1

Sie können dies mit dynamischen Proxies tun, wenn die Eigenschaften virtuell sind. Ein dynamischer Proxy überschreibt die Getter und Setter, benachrichtigt Sie, wenn sie aufgerufen werden, und führt dann die ursprüngliche Methode aus. Andernfalls kopiere den Anruf überall manuell.

+0

Oder, wenn die Eigenschaften nicht virtuell sind, könnte man ein AOP-Framework zur Kompilierung wie PostSharp verwenden. – driis

+0

"Ansonsten kopiere den Anruf überall manuell." :) –

+0

@chibacity blech. TROCKEN. –

0

Sie können ein Abhängigkeitsinjektions-Framework wie Unity, Ninject, Castle Windsor verwenden und einen Interceptor implementieren. Die Aufgabe des Interceptors besteht darin, einen Aufruf an etwas wie eine Methode abzufangen und etwas damit zu tun, wie zum Beispiel die Protokollierung.

fejesjoco erwähnte dynamische Proxies und diese werden von Castle Windsor verwendet, um auch Methodenaufrufe zu überwachen.

Das ist ein großes Thema für dieses Format, aber wenn Sie interessiert sind dann google Ninject Abhören und folgen Sie einem Tutorial darauf. So werden große Softwaresysteme so zusammengestellt, dass sie flexibel sind und zukünftige Veränderungen ermöglichen.

Verwandte Themen