Für eine bestimmte Klasse möchte ich eine Ablaufverfolgungsfunktion haben, dh ich möchte jeden Methodenaufruf (Methodensignatur und tatsächliche Parameterwerte) und jeden Methodenexit (nur die Methodensignatur) protokollieren.
Wie erreiche ich dies unter der Annahme, dass:
- Ich möchte keine AOP-Bibliotheken von Drittanbietern für C # verwenden.
- Ich möchte nicht allen Methoden, die ich verfolgen möchte, doppelten Code hinzufügen.
- Ich möchte die öffentliche API der Klasse nicht ändern - Benutzer der Klasse sollten in der Lage sein, alle Methoden auf genau dieselbe Weise aufzurufen.
Um die Frage konkreter zu machen, nehmen wir an, dass es drei Klassen gibt:
public class Caller
{
public static void Call()
{
Traced traced = new Traced();
traced.Method1();
traced.Method2();
}
}
public class Traced
{
public void Method1(String name, Int32 value) { }
public void Method2(Object object) { }
}
public class Logger
{
public static void LogStart(MethodInfo method, Object[] parameterValues);
public static void LogEnd(MethodInfo method);
}
Wie rufe ich Logger.LogStart und Logger.LogEnd für jeden Aufruf von Methode1 und Methode2 auf, ohne die Caller.Call- Methode zu ändern und ohne die Aufrufe explizit zu Traced.Method1 und Traced.Method2 hinzuzufügen ?
Bearbeiten: Was wäre die Lösung, wenn ich die Call-Methode leicht ändern darf?