Può essere utile in certe situazione conoscere il nome della funzione o metodo che ha richiamato una certa funzionalità. Ad esempio se stiamo loggando delle informazioni per il debug della nostra applicazione è importante sapere l’operazione che si sta eseguendo ma anche il flusso che ha portato ad essa.
Metodo 1 : StackTrace
Un modo per ottenere il nome del metodo di chiamata è usare il metodo StackTrace.GetFrame(). In particolare per ottenere la prima funzione precedente in ordine di chiamata basta creare una nuova istanza di StackTrace e chiamare il metodo GetFrame con parametro 1.
Il parametro appunto è l’indice della chiamata del metodo nello stack di chiamate. L’indice della prima chiamata del metodo (il più vicino) è “1”, quindi restituisce uno StackFrame del metodo chiamante cioè il metodo che ha chiamato direttamente il metodo corrente.
La sintassi corretta è la seguente :
using System.Diagnostics; // Get call stack // Get calling class name string classe = (new StackTrace()).GetFrame(1).GetMethod().DeclaringType.Name // Get calling method name string metodo = (new StackTrace()).GetFrame(1).GetMethod().Name;
Per ottenere il nome del metodo, utilizzare StackFrame.GetMethod () e quindi recuperare il valore della proprietà Name mentre per recuperare il nome della classe chiamante si usa DeclaringType.Name.
Metodo 2 : Reserved attributes
Da c# 5 è possibile dichiarare degli attributi riservati come parametri di una funzione per ottenere determinate informazioni.
Utilizzando gli attributi info, si ottengono informazioni sul chiamante per un metodo. È possibile ottenere il percorso del file del codice sorgente, il numero di riga nel codice sorgente e il nome del membro del chiamante. Per ottenere informazioni sul chiamante del membro, utilizzare gli attributi applicati ai parametri opzionali. Ogni parametro facoltativo specifica un valore predefinito.
Nella tabella seguente sono elencati gli attributi Informazioni sul chiamante definiti nello spazio dei nomi System.Runtime.CompilerServices
CallerFilePathAttribute | Percorso completo del file di origine che contiene il chiamante. Il percorso completo è il percorso al momento della compilazione. |
CallerLineNumberAttribute | Numero di riga nel file di origine da cui viene chiamato il metodo. |
CallerMemberNameAttribute | Nome del metodo o nome della proprietà del chiamante. |
public void funzioneDiTest() { funzioneDaTracciare("messaggio."); } public void funzioneDaTracciare(string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) { Console.WriteLine("message: " + message); Console.WriteLine("member name: " + memberName); Console.WriteLine("source file path: " + sourceFilePath); Console.WriteLine("source line number: " + sourceLineNumber); } // Output: // message:messaggio. // member name: funzioneDiTest // source file path: c:\percorso-completo\Form1.cs // source line number: 31
Sono laureato in Ingegneria Informatica presso l’Univertità degli Studi di Lecce (2008).
Attualmente mi occupo di Sviluppo C#.Net / Mono in ambiente Linux
Sviluppo da anni applicativi ANSI C per terminali POS basati su processori ARM Risc 32Bit con 2-4 MB di Ram.