Per una data classe vorrei avere la funzionalità di traccia, cioè vorrei registrare ogni chiamata di metodo (firma del metodo e valori dei parametri effettivi) e ogni uscita del metodo (solo la firma del metodo).
Come posso ottenere questo presupponendo che:
- Non voglio usare librerie AOP di terze parti per C #,
- Non voglio aggiungere un codice duplicato a tutti i metodi che voglio tracciare,
- Non voglio cambiare l'API pubblica della classe: gli utenti della classe dovrebbero essere in grado di chiamare tutti i metodi esattamente allo stesso modo.
Per rendere la domanda più concreta, supponiamo che ci siano 3 classi:
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);
}
Come posso invocare Logger.LogStart e Logger.LogEnd per ogni chiamata a Method1 e Method2 senza modificare il metodo Caller.Call e senza aggiungere esplicitamente le chiamate a Traced.Method1 e Traced.Method2 ?
Modifica: quale sarebbe la soluzione se potessi modificare leggermente il metodo di chiamata?