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?
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?
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:
static void SomeMethodSomewhere()
{
ShowMessage("Boo");
}
...
static void ShowMessage(string message,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
MessageBox.Show(message + " at line " + lineNumber + " (" + caller + ")");
}
Dies zeigt zum Beispiel Folgendes an:
Boo in Zeile 39 (SomeMethodSomewhere)
Dort finden [CallerFilePath]
Sie auch den Pfad der ursprünglichen Codedatei.
Verwenden Sie die StackFrame.GetFileLineNumber- Methode, zum Beispiel:
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
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:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Die Argumente müssen string
für CallerMemberName
und CallerFilePath
und int
für sein CallerLineNumber
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 .
StackFrame
Beispiel auf Mono kompilieren , stellen Sie sicher, dass Sie es--debug
zur Kompilierungszeit und zur Laufzeit verwenden
StackFrame
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 verwenden string.Empty
.
Ich bevorzuge einen Liner also:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
Für diejenigen, die eine .NET 4.0+ -Methodenlösung benötigen:
using System;
using System.IO;
using System.Diagnostics;
public static void Log(string message) {
StackFrame stackFrame = new System.Diagnostics.StackTrace(1).GetFrame(1);
string fileName = stackFrame.GetFileName();
string methodName = stackFrame.GetMethod().ToString();
int lineNumber = stackFrame.GetFileLineNumber();
Console.WriteLine("{0}({1}:{2})\n{3}", methodName, Path.GetFileName(fileName), lineNumber, message);
}
So rufen Sie an:
void Test() {
Log("Look here!");
}
Ausgabe:
Void Test () (FILENAME.cs: 104)
Schau hier!
Ändern Sie das Console.WriteLine-Format nach Ihren Wünschen!
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.
try
{
//Do something
}
catch (Exception ex)
{
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
In .NET 4.5 können Sie die Zeilennummer erhalten, indem Sie die Funktion erstellen:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
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:
MessageBox.Show("Error enter code here line number " + LineNumber());
Dies baut auf der hervorragenden Antwort von Marc Gravell auf.