Qui esco su un arto e suppongo che tu stia cercando tecniche orientate agli oggetti per implementare la strumentazione.
Ci sono due modi immediati che mi vengono in mente, il più comunemente usato sarebbe il primo a indovinare:
-
Avere un globale (singleton o cosa hai) impila da qualche parte con cui si aggiunge immediatamente ogni metodo che esegue. mantenendo efficacemente una catena di chiamate globale. Potresti non dover fare un salto alla fine di ogni metodo che stai provando a usare, altre comuni pratiche di strumentazione sono di avviare un cronometro all'inizio del tuo metodo e fermarti alla fine per registrare la lunghezza ecc.
-
Avere un framework di tipo DI che è un router per tutte le chiamate di metodo, che potrebbe comportarsi in modo simile al passaggio di messaggi e all'interno di questo framework si annotare in una pila ogni chiamata di metodo che si verifica in modo simile a sopra eccetto sarebbe centralizzato in questo posto.
Non posso dire di suggerire # 2 senza forse usare qualche framework AOP o qualcosa del genere, ma in generale, mantenere la propria traccia dello stack sul 100% delle chiamate al metodo è un po 'una strumentazione estrema ai miei occhi. Ottimo per eseguire il debug di tipo e forse necessario se non si sta lavorando in un linguaggio riflessivo, ma sarei sicuro di poter girare qualcosa del genere facilmente per la produzione e fare del mio meglio per tenerlo fuori mano, motivo per cui non mi piace molto il # 2 sopra.
Nessuno di questi è necessario all'interno di un linguaggio riflessivo e pertanto non dovrebbe essere implementato in C # tranne che per illustrare i confini del processo di attraversamento. (attenzione: potrebbe essere più veloce della riflessione se fatto bene, ma il costo di manutenzione continua a renderli non ne vale la pena)