517 Stimmen

Wie man den Namen der aktuellen Methode aus dem Code erhält

Ich weiß, dass du es kannst

this.GetType().FullName

Um die

My.Current.Class

Aber was kann ich anrufen, um die

My.Current.Class.CurrentMethod

11 Stimmen

this.ToString() gibt Ihnen den aktuellen Klassennamen nur, wenn Sie nichts Besonderes in Ihrem eigenen public override string ToString() . GetType().FullName gibt immer Ihren vollen Namen an.

0 Stimmen

@Pasi danke, werde meine Implementierung ändern

6 Stimmen

In .Net 4.5 können Sie das Attribut CallerMemberNameAttribute verwenden, um den Namen des Aufrufers zu erhalten. Siehe msdn.microsoft.com/de-us/library/ ... Sie können dann den Körper Ihrer Funktion in eine anonyme Funktion wie in ([CallerMemberName] string functionName = "")=>{ } verpacken. Die Probleme bei der Verwendung der Reflection-Methode wie in der akzeptierten Antwort bestehen darin, dass (1) die Funktion möglicherweise inlined wird und/oder (2) der Funktionsname verschleiert werden kann, wenn er nicht öffentlich ist und der Code verschleiert wird.

10voto

João Angelo Punkte 54226

Sie können auch Folgendes verwenden MethodBase.GetCurrentMethod() was den JIT-Compiler daran hindert, die Methode, in der sie verwendet wird, zu inlinen.


更新しました。

Diese Methode enthält eine spezielle Aufzählung StackCrawlMark die nach meinem Verständnis dem JIT-Compiler mitteilt, dass die aktuelle Methode nicht inlined werden soll.

Dies ist meine Interpretation des Kommentars zu dieser Aufzählung im SSCLI. Der Kommentar folgt:

// declaring a local var of this enum type and passing it by ref into a function 
// that needs to do a stack crawl will both prevent inlining of the calle and 
// pass an ESP point to stack crawl to
// 
// Declaring these in EH clauses is illegal; 
// they must declared in the main method body

0 Stimmen

Haben Sie eine Referenz, die erklärt, wie GetCurrentMethod das JIT am Inlining der aufrufenden Methode hindert?

0 Stimmen

@Luke, ich habe meine Antwort mit dem Grund aktualisiert, warum ich glaube, dass die Methode das Inlining verhindern wird.

0 Stimmen

Danke, das ist sehr interessant, obwohl mir nicht ganz klar ist, ob es das Inlining der Methode verhindert, die die lokale StackCrawlMark oder der Aufrufer dieser Methode.

7voto

Arefin Punkte 59

Quelle: System.Reflection.MethodBase.GetCurrentMethod().Name ist keine gute Wahl, denn es wird nur der Name der Methode ohne zusätzliche Informationen angezeigt.

Wie für string MyMethod(string str) wird die oben genannte Eigenschaft nur MyMethod was kaum angemessen ist.

Es ist besser zu verwenden System.Reflection.MethodBase.GetCurrentMethod().ToString() die die gesamte Signatur der Methode zurückgibt...

2 Stimmen

Ich erhalte MoveNext anstelle meines Methodennamens.

2 Stimmen

Bei asynchronen Methoden führt dies zu MoveNext

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X