2008-11-11 12 views
5

Geschlossen als exakte Kopie von "How can I find the method that called the current method?"Wie finden Sie die Anruferfunktion?

Ist this möglich mit 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

Diese Frage ist ein Duplikat von 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-die-methode-die-so-die-aktuelle-methode) –

Antwort

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

Dies ist jedoch nicht robust, insbesondere als Optimierungen (wie JIT inlining) sind Affen mit dem erkannten Stapelrahmen.

+0

Hallo, Marc. Wäre es aufgrund von JIT möglich, dass sich ein Methodenname während der Laufzeit ändern könnte? – Joe

+0

@Joe es ist sicherlich möglich, nicht zu bekommen, was Sie * erwartet *, was aufgrund von Inlining sein könnte, oder aufgrund von Compiler-generierten Methoden für Dinge wie anonyme Methoden und Iterator-Blöcke. Ich würde nicht erwarten, dass es plötzlich komplett umbenannt wird, es sei denn, Sie verwenden einen Obfuscator. –

3

Von 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); 

Aber es gibt auch eine Bemerkung, dass dies nicht mit Multi-Threading arbeiten konnte.

+1

Vielen Dank für die Erwähnung der Bemerkung. Ich habe mich gefragt, warum ich eine "NullReferenceException" bekommen habe, als ich versucht habe, den Methodennamen aus einem neuen Thread zu bekommen. – Animesh