167 Stimmen

Wie erhalte ich die aktuelle Zeilennummer?

Hier ist ein Beispiel dafür, was ich tun möchte:

MessageBox.Show("Error line number " + CurrentLineNumber);

Im obigen Code wird die CurrentLineNumber sollte die Zeilennummer im Quellcode dieses Teils des Codes sein.

Wie kann ich das tun?

242voto

Marc Gravell Punkte 970173

In .NET 4.5 / C# 5 können Sie den Compiler dazu bringen, diese Arbeit für Sie zu erledigen, indem Sie eine Dienstprogrammmethode schreiben, die die neuen Aufruferattribute verwendet:

using System.Runtime.CompilerServices;

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 + ")");
}

So wird zum Beispiel angezeigt:

Boo in Zeile 39 (SomeMethodSomewhere)

Außerdem gibt es [CallerFilePath] die Ihnen den Pfad der ursprünglichen Codedatei angibt.

93voto

akton Punkte 13980

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());
}

Voir Scott Hanselman's Blog-Eintrag をご覧ください。

[Bearbeiten: Folgendes hinzugefügt]

Diejenigen, die .Net 4.5 oder höher verwenden, sollten die CallerFilePath , CallerMethodName y CallerLineNumber Attribute im Namespace System.Runtime.CompilerServices. Zum Beispiel:

public void TraceMessage(string message,
        [CallerMemberName] string callingMethod = "",
        [CallerFilePath] string callingFilePath = "",
        [CallerLineNumber] int callingFileLineNumber = 0)
{
    // Write out message
}

Die Argumente müssen sein string pour CallerMemberName y CallerFilePath und ein int pour CallerLineNumber und muss einen Standardwert haben. Durch die Angabe dieser Attribute bei Methodenparametern wird der Compiler angewiesen, den entsprechenden Wert zur Kompilierungszeit in den aufrufenden Code einzufügen, d.h. er arbeitet durch Verschleierung. Siehe Informationen zum Anrufer をご覧ください。

24voto

iambriansreed Punkte 21534

Ich bevorzuge also Einzeiler:

int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();

7voto

Brian Cryer Punkte 1919

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; 
}

Dann wird jedes Mal, wenn Sie anrufen LineNumber() erhalten Sie die aktuelle Zeile. Dies hat den Vorteil gegenüber jeder Lösung, die den StackTrace verwendet, dass es sowohl in Debug als auch in Release funktionieren sollte.

Wenn man also die ursprüngliche Forderung zugrunde legt, würde dies bedeuten:

MessageBox.Show("Error enter code here line number " + LineNumber());

Dies baut auf der ausgezeichneten Antwort von Marc Gravell auf.

4voto

Jared Burrows Punkte 52572

Für diejenigen, die eine .NET 4.0+ Methode 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);
}

Wie Sie anrufen können:

void Test() {
   Log("Look here!");
}

Salida:

Void Test()(FILENAME.cs:104)

Sehen Sie hier!

Ändern Sie das Format von Console.WriteLine, wie Sie möchten!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X