Dla danej klasy chciałbym mieć funkcjonalność śledzenia tj. Chciałbym logować każde wywołanie metody (podpis metody i rzeczywiste wartości parametrów) i każde wyjście metody (tylko podpis metody).
Jak to osiągnąć, zakładając, że:
- Nie chcę używać żadnych bibliotek AOP innych firm dla języka C #,
- Nie chcę dodawać zduplikowanego kodu do wszystkich metod, które chcę śledzić,
- Nie chcę zmieniać publicznego API klasy - użytkownicy klasy powinni mieć możliwość wywołania wszystkich metod w dokładnie taki sam sposób.
Aby pytanie było bardziej konkretne, przyjmijmy, że istnieją 3 klasy:
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);
}
Jak wywołać Logger.LogStart i Logger.LogEnd dla każdego wywołania Method1 i Method2 bez modyfikowania metody Caller.Call i bez jawnego dodawania wywołań do Traced.Method1 i Traced.Method2 ?
Edycja: Jakie byłoby rozwiązanie, jeśli mogę nieznacznie zmienić metodę Call?