Hat jemand eine gute Lösung für eine C# -Version des Makros C++ __FUNCTION__? Der Compiler scheint es nicht zu mögen.C# -Version von __FUNCTION__ Makro
Antwort
Versuchen Sie es stattdessen.
System.Reflection.MethodBase.GetCurrentMethod().Name
C# nicht über __LINE__
oder __FUNCTION__
Makros wie C++, aber es gibt Mittel
Die folgenden sollte funktionieren, obwohl es zur Laufzeit ausgewertet werden, anstatt während der Kompilierung.
System.Reflection.MethodBase.GetCurrentMethod().Name
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
Richtig, es wäre schön, eine Kompilierungslösung zu haben. Für meinen Zweck ist Reflexion ausreichend. –
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.
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 ..
Das .NET 4.5 in hinzugefügt wird.
See @ roken Antwort hier:
- 1. Fehlerprotokollierung von C++ - Präprozessor-Makros __LINE__, __FUNCTION__
- 2. Equivalent von __FUNC__ oder __FUNCTION__ in Rust?
- 3. GCC, Unicode und __FUNCTION__
- 4. PSTR() auf __FUNCTION__
- 5. g ++ __FUNCTION__ Ersetzungszeit
- 6. Entsprechung von __FUNCTION__ von C lanauage in Java
- 7. __FILE__, __LINE__ und __FUNCTION__ Verwendung in C++
- 8. Makro innerhalb von Makro in C
- 9. Makro für Visual Studio Version
- 10. C-Präprozessor Makro definierendes Makro
- 11. Vergleichen Eingabeparameter von C++ Makro
- 12. Plattformübergreifend für Makros definieren #define __FUNCTION__ und __FUNC__
- 13. C# Version von optparse?
- 14. C++ liefert Funktionsname zu Makro und ruft es auf
- 15. C Präprozessor: stringize Makro und Identität Makro
- 16. C++ Vorlage Makro Abkürzung
- 17. C-Makro-Argument 'Lagerung'
- 18. C++ Makro - kapitalisieren String
- 19. VBA: Programmierung Standalone Version von Goalseek Makro-Äquivalent
- 20. C-Makro-Erweiterung
- 21. "mit" Makro in C
- 22. c definieren Multiline-Makro?
- 23. C Makro/# Einrückung definieren?
- 24. C++ Makro-Nebeneffekt
- 25. C++ Makro für Funktionsname
- 26. C seltsam Makro Syntax
- 27. Offset von Makro mit C++/CLI
- 28. Regex __P() Makro von C-Quelldateien entfernen
- 29. Makro für das Lesen von Matrix C++
- 30. Verwirrt von Makro SQR in c quadriert
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) –
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! –