2008-11-11 4 views
5

Fermé en double exact de "How can I find the method that called the current method?"Comment trouvez-vous la fonction d'appelant?

Est-this possible avec C#?

void main() 
{ 
    Hello(); 
} 

void Hello() 
{ 
    // how do you find out the caller is function 'main'? 
} 
+0

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

+0

Cette question est un doublon de [http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method](http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method) –

Répondre

17
Console.WriteLine(new StackFrame(1).GetMethod().Name); 

Cependant, ce n'est pas robuste, d'autant plus que (comme Optimisations JIT inline) peuvent singe avec les cadres de pile perçus.

+0

Salut, Marc. Serait-il possible, à cause de JIT, qu'un nom de méthode puisse changer pendant Runtime? – Joe

+0

@Joe il est certainement possible de ne pas obtenir ce que vous attendiez *, ce qui pourrait être dû à l'inline, ou à des méthodes générées par le compilateur pour des choses comme les méthodes anonymes et les blocs d'itérateurs. Je ne m'attends pas à ce qu'il soit complètement rebaptisé, sauf si vous utilisez un obfuscator. –

3

De here:

System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(1); 
System.Diagnostics.StackFrame sf = st.GetFrame(0); 
string msg = sf.GetMethod().DeclaringType.FullName + "." + 
sf.GetMethod().Name; 
MessageBox.Show(msg); 

Mais il y a aussi une remarque que cela pourrait ne pas fonctionner avec le multi-threading.

+1

Merci beaucoup d'avoir mentionné la remarque. Je me demandais pourquoi j'avais une 'NullReferenceException' quand j'ai essayé d'obtenir le nom de la méthode depuis un nouveau thread. – Animesh

Questions connexes