Come ottengo il nome e il tipo del metodo di chiamata usando la riflessione?

Possibile duplicato:
Come posso trovare il metodo che ha chiamato il metodo corrente?

Mi piacerebbe scrivere un metodo che ottiene il nome del metodo chiamante e il nome della class che contiene il metodo chiamante.

È ansible con il riflesso C #?

public class SomeClass { public void SomeMethod() { StackFrame frame = new StackFrame(1); var method = frame.GetMethod(); var type = method.DeclaringType; var name = method.Name; } } 

Ora diciamo che hai un’altra class come questa:

 public class Caller { public void Call() { SomeClass s = new SomeClass(); s.SomeMethod(); } } 

il nome sarà “Chiama” e il tipo sarà “Chiamante”

AGGIORNAMENTO Due anni più tardi da quando sto ancora ottenendo voti su questo

In. Net 4.5 ora c’è un modo molto più semplice per farlo. Puoi usufruire del CallerMemberNameAttribute

Andando con l’esempio precedente:

 public class SomeClass { public void SomeMethod([CallerMemberName]string memberName = "") { Console.WriteLine(memberName); //output will be name of calling method } } 

Puoi usarlo usando StackTrace e quindi puoi ottenere tipi riflessivi da quello.

 StackTrace stackTrace = new StackTrace(); // get call stack StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) StackFrame callingFrame = stackFrames[1]; MethodInfo method = callingFrame.GetMethod(); Console.Write(method.Name); Console.Write(method.DeclaringType.Name); 

In realtà è qualcosa che può essere fatto usando una combinazione dei dati di tracciamento e di riflessione attuali.

 public void MyMethod() { StackTrace stackTrace = new System.Diagnostics.StackTrace(); StackFrame frame = stackTrace.GetFrames()[1]; MethodInfo method = frame.GetMethod(); string methodName = method.Name; Type methodsClass = method.DeclaringType; } 

L’indice 1 sull’array StackFrame ti darà il metodo che ha chiamato MyMethod

Sì, in principio è ansible, ma non viene gratis.

È necessario creare uno StackTrace e quindi è ansible dare un’occhiata allo StackFrame dello stack di chiamate.

Tecnicamente, puoi usare StackTrace, ma questo è molto lento e non ti darà le risposte che ti aspetti più spesso. Questo perché durante le build di rilascio possono verificarsi ottimizzazioni che rimuoveranno determinate chiamate di metodo. Quindi non puoi essere sicuro nel rilascio se lo stacktrace è “corretto” o meno.

Davvero, non c’è alcun modo infallibile o veloce per farlo in C #. Dovresti davvero chiederti perché ne hai bisogno e come puoi architettare la tua applicazione, così puoi fare ciò che vuoi senza sapere quale metodo lo chiama.