Frage

Hat jemand eine gute Lösung für eine C # Version des C ++ hat __FUNCTION__ Makro? Der Compiler scheint nicht zu mögen.

War es hilfreich?

Lösung

Versuchen Sie stattdessen verwenden.

System.Reflection.MethodBase.GetCurrentMethod().Name

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

Andere Tipps

Was ich zur Zeit verwenden, ist eine Funktion wie folgt aus:

using System.Diagnostics;

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

Wenn ich __FUNCTION__ brauchen, ich nenne nur die __Function () statt. Zum Beispiel:

Debug.Assert(false, __Function() + ": Unhandled option");

Natürlich ist diese Lösung verwendet Reflektion auch, aber es ist die beste Option, die ich finden kann. Da ich es nur verwenden, zum Debuggen der Performance-Einbußen nicht wichtig (nicht in Release Tracing-Builds) sind.

Ich denke, was soll ich tun, ist Debug-Funktionen erstellen und markieren sie mit

[ Conditional("Debug") ]

statt, aber ich habe nicht dazu gekommen, dass.

Dank Jeff Mastry für seine Lösung dazu.

Leider gibt es keine gleichwertige Version dieses Makro in C #. Ich habe nicht das GetCurrentMethodName () Lösung entspricht den Makro C ++ __FUNCTION__ betrachten. Nämlich becase der C ++ Version ist eine Kompilierung Berechnung des Namens. Für C # ist dies eine Laufzeitberechnung und verursacht eine Performance-Einbußen.

Ich mache keine assumtions über die Schwere der Kosten, aber es gibt ein

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

System.Reflection.MethodBase.GetCurrentMethod().Name

Dies wird hinzugefügt in .NET 4.5.

Siehe @ roken Antwort hier:

Sie __LINE__ __FILE__ Äquivalente in C # existieren?

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 ==> zeitraubend und Leistungseinbußen! Also, ich benutze es perpose für das Debuggen und wenn ich brauche auch in Produktionscode zu drucken, ich inline in der Regel die Namen der Funktion in die log.debug, z.B. :

s_log.Debug("CallerName");

HTH ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top