2010-08-25 9 views
5

Mi è stato recentemente assegnato l'incarico di aggiungere istruzioni di registrazione a ogni chiamata di metodo in una soluzione. Queste voci di registro devono contenere il nome della classe e del metodo.Accesso in C#: acquisizione delle prestazioni nome classe/metodo

So che posso usare i metodi MethodBase.GetCurrentMethod() e StackFrame.GetMethod(). Che è migliore? Esiste un modo migliore (o più performante) per ottenere il nome della classe e del metodo?

+5

* Ogni * metodo? Ci sono modi più semplici per rendere la tua app diecimila volte più lenta o per generare un gigabyte di testo al minuto. –

+3

Il mio destino nella vita è solo quello di fare quello che chiede il cliente. –

+0

c'è un posto nel rapporto di consulenza per le critiche costruttive e, di fatto, è una parte importante del lavoro. Ho lavorato su progetti che avevano questo tipo di registrazione pervasiva di tracciamento e in genere è stato fatto in modo che tutti ignorassero i log a meno che non dovessero assolutamente impiegare le diverse ore necessarie per scavare attraverso di essi. –

risposta

5

ho due suggerimenti:

  1. utilizzare framework AOP ready-made (come http://www.sharpcrafters.com/) in grado di gestire facilmente questo
  2. fare un'azione prebuild personalizzato in cui si sostituisce un qualche tipo di stub all'inizio del ogni metodo:

    vuoto PerformSomeAction() { // PUT_LOGGING_HERE }

quindi nello strumento personalizzato sostituire questi stub con i nomi dei metodi. Questo è il metodo più veloce garantito, ma richiede alcuni investimenti.

+0

+1, È questo tipo di scenario per cui è stato creato AOP. –

+0

Avrei potuto, ho già portato questo suggerimento. Non che non sia un punto eccellente. –

1

this.getType().toString() dovrebbe ottenere la classe

Circa il metodo sembra StackFrame e MethodBase sono i più obvouis soluzioni, Non posso commentare che è più efficiente.

+1

eccetto che questo è C#, non Java, ma generalmente hai ragione – Andrey

+0

Dovrebbe essere this.GetType(). ToString()? o mi manca qualcos'altro – Raynos

+0

Object.ToString() restituirà il nome della classe a meno che ToString() non venga sovrascritto. – Nate

2

Bene, il modo migliore/più veloce è quello di includere una stringa in ogni funzione. Potrebbe non sembrare la soluzione più pratica, ma MethodBase.GetCurrentMethod() richiede la codifica all'interno di ogni metodo che lo utilizza comunque. vale a dire È possibile scrivere

string funcName = "MyClass.MyFunction(int, int)"; 

o è possibile scrivere

string funcName = MethodBase.GetCurrentMethod().Name 

Ora, se si vuole ottenere il nome della funzione che chiamato la funzione corrente (ad esempio, si vuole fare questo in un punto nella funzione di registrazione), quindi l'unica opzione è la lettura dello StackFrame.

+0

Se ricordo bene, MethodBase.GetCurrentMethod() potrebbe anche restituire risultati diversi in base a qualsiasi inlining/ottimizzazione fatto dal compilatore, quindi i nomi delle funzioni hardcoding potrebbero essere più affidabili in questo senso. –

+0

puoi automatizzare incluso il nome della funzione come stringa al processo di compilazione – Andrey

Problemi correlati