Aspekt orientierte Programmierung wird immer beliebter und viele gute Frameworks sind verfügbar, die einem dabei helfen. Jedoch kann man auch ganz ohne ein Framework aspekt orientiert programmieren.
Folgender Code Ausschnitt zeigt eine Methode mit dessen Hilfe ich Methoden Nutzungen loggen kann:
public static T CallWithLogging<T>( Expression<Func<T>> toCall) { Console.WriteLine($"1: Call function {toCall.Body}"); T result = toCall.Compile()(); Console.WriteLine( "1: Result of Function call: " + result ); return result; }
Expression<Func<T>> stellt ein ExpressionTree dar, der durch toCall.Compile() zur Laufzeit kompiliert wird. Mit toCall.Body kann der übergebene Ausdruck als String ausgegeben werden.
Die CallWithLogging<T> Funktion kann wie folgt benutzt werden:
int max1 = FunctionExtension.CallWithLogging(() => Math.Max(3, 4)); Console.WriteLine($"max1:{max1}");
Die Konsolen Ausgabe wäre dann wie folgt:
Call function Max(3, 4) Result of Function call: 4 max1:4
Alternativ zum Expression Tree kann man auch direkt ein Action<…> oder Func<…> reingeben und einfach mal einen Performance Tester implementieren:
public static void PerformanceTest(Action toExecute) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); toExecute(); stopWatch.Stop(); Console.WriteLine("Execution takes: " + stopWatch.ElapsedMilliseconds + " milliseconds."); }
Die Benutzung der Funktion kann dann wie folgt aussehen:
FunctionExtension.PerformanceTest(() => { Thread.Sleep(300); Console.WriteLine("Nearly finished!"); Thread.Sleep(100); });