2009-08-21 8 views
32

Possible en double:
How can I find the method that called the current method?Obtenir appel nom de la fonction de fonction appelée

Comment puis-je obtenir le nom de la fonction d'appel de la fonction appelée en C#?

+1

Duplicata de http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method –

+2

Ceci est une dupe, mais vaut probablement la peine d'être ouverte en raison à la terminologie différente - pourrait être utile pour les personnes qui cherchent. – Keith

+1

@Keith: Oui, pour cette raison, nous essayons généralement de garder les questions en double quand on leur demande de manière très différente - c'est pourquoi les fermer automatiquement ajoute les liens tout en haut, de sorte que les futurs chercheurs puissent trouver leur chemin. les réponses plus rapidement. – Shog9

Répondre

70
new StackFrame(1, true).GetMethod().Name 

Notez que dans la version construit le compilateur pourrait inline la méthode appelée, dans ce cas, le code ci-dessus renverrait l'appelant de l'appelant, afin d'être en sécurité, vous devez décorer votre méthode avec:

[MethodImpl(MethodImplOptions.NoInlining)] 
+11

Méfiez-vous que la marche de la pile de cette façon imposera un coup de performance assez lourd. Je recommande fortement de chercher une solution qui n'implique pas une pile avant d'en utiliser une. – jrista

+1

Cette réponse est en fait meilleure que les réponses dans la question en double en raison de la mention de l'attribut MethodImpl. –

+8

Je sais que c'est un dupe et étiqueté .net 3.5, mais pour aider les chercheurs qui trébuchent sur celui-ci en premier (comme moi), il serait bon d'indiquer dans votre réponse qu'en C# 5.0, vous pouvez utiliser les informations de l'appelant dans: http://visualstudiomagazine.com/articles/2012/11/01/more-than-just-async.aspx – acarlon

14

vous obtiendrez le nom de la méthode que vous êtes:

string currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name; 

Utiliser avec prudence, car il pourrait y avoir une baisse de performance.

To get callers: 
StackTrace trace = new StackTrace(); 
int caller = 1; 

StackFrame frame = trace.GetFrame(caller); 

string callerName = frame.GetMethod().Name; 

Ceci utilise une pile de marche pour obtenir le nom de la méthode. La valeur de l'appelant est à quelle distance de la pile d'appels aller. Veillez à ne pas aller trop loin.

+0

J'ai besoin de quelle méthode appelle la méthode actuelle. – Sauron

+0

La façon dont vous obtenez le nom de l'appelant à partir de la trace de la pile, ce sera un coup de performance? – Panos

Questions connexes