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?

3voto

Nate-Wilkins Punkte 5243

Wenn seine in einem Try-Catch-Block verwenden Sie diese.

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

-1voto

Walter Verhoeven Punkte 3009

Sie haben nur nach der Zeilennummer gefragt und mit nullable project type, müssen Sie dann etwas wie dieses verwenden

internal class Utils
{
   public static int Line([CallerLineNumber] int? lineNumber =null)=>lineNumber;
}

in Ihrem Code, wenn Sie eine Zeilennummer erhalten möchten, rufen Sie einfach

var line=Utils.Line();

Wenn Sie protokollieren und die Zeilennummer in der Protokollierung dokumentieren möchten, rufen Sie die Methode wie folgt auf

public void MyMethod(int someValue)
{
    switch(someValue)
    { 
        case 1:
            if(abc<xyz)
            {
             logger.LogInformation("case value {someValue} this line {line} was true", someValue ,Utils.Line()-2);
            }
            break;

        case 2:
           logger.LogInformation("case value {someValue} this {line} was executed",someValue,Utils.Line());
           break;
        caste 3:
           logger.LogInformation("case value {someValue} this {line} was executed",someValue,Utils.Line());
           break;
    }
}

Sie können dieses Muster mit jeder der anderen [CallerXXX]-Methoden erweitern und sie nicht nur in den Methodenparametern, sondern auch an anderen Stellen verwenden.

im Nuget-Paket Walter Ich verwende eine super coole Klasse namens ExceptionObject

Wenn Sie das NuGet-Paket importieren, haben Sie einige schöne Erweiterungsmethoden für die Klasse Exception sowie Zugriff auf einen CallStack, der die Aufrufkette einschließlich der Methodenparameter und Parameterwerte aller aufgerufenen Methoden anzeigt.

Es ist wie ein Stapel einer Ausnahme, nur mit Werten, die zeigen, wie Sie mit welchen Werten dorthin gekommen sind.

public void MyMethod()
{
    try
    {

      //get me all methods, signatures, parameters line numbers file names etc used as well as assembly info of all assemblies used for documentation of how the code got here
      var stack= new CallStack();
      foreach( var frame in StackedFrames)
      {
         logger.LogDebug(frame.ToString());
      }
    }
    catch(SqlException e)
    {
       var ex = new ExceptionObject(e);
       logger.LogException(e,"{this} exception due to {message} {server} {procedure} TSQL-line:{sqlline}\n{TSQL}"
                            ,e.GetType().Name
                            ,e.Message
                            ,ex.SqlServer
                            ,ex.SqlProcedureName
                            ,ex.SqlLineNumber
                            ,ex.Tsql
                            ,ex.CallStack); 
    }
    catch(Exception e)
    {
       var ex = new ExceptionObject(e);
       logger.LogException(e,"{this} exception due to {message} signature: signature}\nCallStack:", e.GetType().Name,e.Message,ex.Signature,ex.CallStack); 
    }
}

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