2008-11-03 11 views

Antwort

18

Versuchen Sie es stattdessen.

System.Reflection.MethodBase.GetCurrentMethod().Name 

C# nicht über __LINE__ oder __FUNCTION__ Makros wie C++, aber es gibt Mittel

+4

Da dies ein Top-und akzeptiert ist, können Sie/jemand hinzufügen: System.Reflection.MethodBase.GetCurrentMethod().ToString() wird auch die Parameter liefern, so dass es angesichts von Überladungen nicht mehrdeutig ist und dass System.Reflection.MethodBase.GetCurrentMethod() .DeclaringType.ToString() den C-Namen (& Namespace) –

+1

gibt, gibt es eine #line Metadaten- Makro, das verwendet wird, um Debuginformationen zu geben. Der Compiler wird sie für Sie injizieren, also seien Sie vorsichtig mit normalem Code! –

4

Die folgenden sollte funktionieren, obwohl es zur Laufzeit ausgewertet werden, anstatt während der Kompilierung.

System.Reflection.MethodBase.GetCurrentMethod().Name 
6

Leider gibt es in C# keine entsprechende Version dieses Makros. Ich denke nicht, dass die GetCurrentMethodName() - Lösung dem Makro C++ __FUNCTION__ entspricht. Namentlich ist die C++ - Version eine Kompilierzeitberechnung des Namens. Für C# ist dies eine Laufzeitberechnung und es tritt ein Performance-Treffer auf.

Ich bin keine assumtions über die Schwere der Kosten zu machen, aber es gibt eine

+0

Richtig, es wäre schön, eine Kompilierungslösung zu haben. Für meinen Zweck ist Reflexion ausreichend. –

7

Was ich zur Zeit verwenden eine Funktion ist wie folgt:

using System.Diagnostics; 

public string __Function() { 
    StackTrace stackTrace = new StackTrace(); 
    return stackTrace.GetFrame(1).GetMethod().Name; 
} 

Als ich __FUNCTION__ brauchen, ich einfach anrufen stattdessen die __Funktion(). Zum Beispiel:

Natürlich verwendet diese Lösung auch Reflexion, aber es ist die beste Option, die ich finden kann. Da ich es nur zum Debuggen verwende (nicht Tracing in Release-Builds), ist der Performance-Hit nicht wichtig.

Ich denke, was soll ich tun, erstellen Funktionen debuggen und markieren sie mit

[ Conditional("Debug") ] 

statt, aber ich habe nicht um zu dem bekam.

Danke an Jeff Mastry für seine solution zu diesem.

1

Ich benutze diese:

public static string CallerName([CallerMemberName] string callerName = "") 
{ 
    return callerName; 
} 

Anwendungsbeispiel:

s_log.DebugFormat("{0}", CallerName()); 

Die Kehrseite, es zu benutzen ist, dass jedes Mal, wenn Sie den Anrufernamen drucken möchten, müssen Sie die Funktion springen ==> zeitaufwendig & Leistungshit! So verwende ich es zum Debuggen von Perpose und wenn ich auch in Produktionscode drucken muss, inline ich normalerweise den Funktionsnamen in das log.Debug, z. :

s_log.Debug("CallerName"); 

HTH ..