Hier ist ein Beispiel dafür, was ich tun möchte:
MessageBox.Show("Error line number " + CurrentLineNumber);
Im Code über CurrentLineNumber
sollte die Zeilennummer im Quellcode dieses Codeteils sein.
Wie kann ich das machen?
c#
wpf
c#-4.0
line-numbers
MonsterMMORPG
quelle
quelle
Antworten:
In .NET 4.5 / C # 5 können Sie den Compiler veranlassen, diese Arbeit für Sie zu erledigen, indem Sie eine Dienstprogrammmethode schreiben, die die neuen Aufruferattribute verwendet:
Dies zeigt zum Beispiel Folgendes an:
Dort finden
[CallerFilePath]
Sie auch den Pfad der ursprünglichen Codedatei.quelle
Verwenden Sie die StackFrame.GetFileLineNumber- Methode, zum Beispiel:
Siehe Scott Hanselman Blog - Eintrag für weitere Informationen.
[Bearbeiten: Folgendes hinzugefügt]
Berücksichtigen Sie für Benutzer von .Net 4.5 oder höher die Attribute CallerFilePath , CallerMethodName und CallerLineNumber im Namespace System.Runtime.CompilerServices. Beispielsweise:
Die Argumente müssen
string
fürCallerMemberName
undCallerFilePath
undint
für seinCallerLineNumber
und einen Standardwert haben. Wenn Sie diese Attribute in Methodenparametern angeben, wird der Compiler angewiesen, zur Kompilierungszeit den entsprechenden Wert in den aufrufenden Code einzufügen. Dies bedeutet, dass die Verschleierung erfolgt. Weitere Informationen finden Sie unter Anruferinformationen .quelle
StackFrame
Beispiel auf Mono kompilieren , stellen Sie sicher, dass Sie es--debug
zur Kompilierungszeit und zur Laufzeit verwendenStackFrame
ist in .NET Core nicht verfügbar. Verwenden Sie die Antwort von Marc Gravell.= string.Empty
der Fehler "Standardparameterwert für 'CallingFilePath' muss eine Konstante zur Kompilierungszeit sein" ausgelöst !""
) anstelle von zu verwendenstring.Empty
.Ich bevorzuge einen Liner also:
quelle
Für diejenigen, die eine .NET 4.0+ -Methodenlösung benötigen:
So rufen Sie an:
Ausgabe:
Ändern Sie das Console.WriteLine-Format nach Ihren Wünschen!
quelle
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
Folgendes verwenden, können Sie auf die Zeile im Ausgabefenster klicken und zu dieser Zeile in der Quelle weitergeleitet werden.Wenn es sich in einem Try-Catch-Block befindet, verwenden Sie diesen.
quelle
In .NET 4.5 können Sie die Zeilennummer erhalten, indem Sie die Funktion erstellen:
Jedes Mal, wenn Sie anrufen
LineNumber()
, haben Sie die aktuelle Leitung. Dies hat gegenüber jeder Lösung, die StackTrace verwendet, den Vorteil, dass sie sowohl beim Debuggen als auch beim Release funktionieren sollte.Wenn man also die ursprüngliche Anfrage von dem nimmt, was benötigt wird, würde es werden:
Dies baut auf der hervorragenden Antwort von Marc Gravell auf.
quelle