webentwicklung-frage-antwort-db.com.de

Wie bekomme ich die aktuelle Zeilennummer?

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

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

Die aktuelle Zeilennummer ist die Zeilennummer im Quellcode dieses Codeteils.

Wie kann ich das machen?

106
MonsterMMORPG

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:

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:

Boo in Zeile 39 (SomeMethodSomewhere)

Es gibt auch [CallerFilePath], das den Pfad der ursprünglichen Codedatei angibt.

156
Marc Gravell

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

Weitere Informationen finden Sie unter Scott Hanselmans Blogeintrag .

[Bearbeiten: Folgendes hinzugefügt]

Berücksichtigen Sie bei Verwendung 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 ein int für CallerLineNumber sein 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, was bedeutet, dass die Verschleierung durchgeführt wird. Weitere Informationen finden Sie unter Anruferinformationen .

66
akton

Ich bevorzuge einen Liner, also:

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

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:

Ungültigkeitstest () (FILENAME.cs: 104)

Schau hier!

Ändern Sie das Console.WriteLine-Format nach Ihren Wünschen!

4
Jared Burrows

Wenn es in einem try catch Block ist, benutze dies.

try
{
    //Do something
}
catch (Exception ex)
{
    System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
    Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
3
Nate-Wilkins

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 haben Sie bei jedem Aufruf von LineNumber() die aktuelle Zeile. Dies hat gegenüber jeder Lösung, die StackTrace verwendet, den Vorteil, dass es sowohl im Debug- als auch im Release-Modus funktioniert.

Nehmen wir also die ursprüngliche Anforderung von dem, was erforderlich ist, so wird dies:

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

Dies baut auf der hervorragenden Antwort von Marc Gravell auf.

1
Brian Cryer