web-dev-qa-db-fra.com

Comment puis-je obtenir le numéro de ligne actuel?

Voici un exemple de ce que je veux faire:

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

Le numéro de ligne actuel sera le numéro de ligne dans le code source de cet élément de code.

Comment puis je faire ça?

106
MonsterMMORPG

Dans .NET 4.5/C # 5, vous pouvez demander au compilateur de faire ce travail pour vous, en écrivant une méthode utilitaire utilisant les nouveaux attributs de l'appelant:

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

Cela affichera, par exemple:

Boo à la ligne 39 (SomeMethodSomewhere)

Il y a aussi [CallerFilePath] qui vous indique le chemin du fichier de code original.

156
Marc Gravell

Utilisez la méthode StackFrame.GetFileLineNumber , par exemple:

private static void ReportError(string message)
{
     StackFrame callStack = new StackFrame(1, true);
     MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName() 
          + ", Line: " + callStack.GetFileLineNumber());
}

Voir entrée du blog de Scott Hanselman pour plus d'informations.

[Edit: Ajouté le suivant]

Pour ceux qui utilisent .Net 4.5 ou une version ultérieure, considérez les attributs CallerFilePath , CallerMethodName et CallerLineNumber dans l'espace de noms System.Runtime.CompilerServices. Par exemple:

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

Les arguments doivent être string pour CallerMemberName et CallerFilePath et un int pour CallerLineNumber et doivent avoir une valeur par défaut. La spécification de ces attributs sur les paramètres de méthode indique au compilateur d'insérer la valeur appropriée dans le code appelant au moment de la compilation, ce qui signifie qu'il fonctionne par obscurcissement. Voir Informations sur l'appelant pour plus d'informations.

66
akton

Je préfère un liners alors:

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

Pour ceux qui ont besoin d'une solution de méthode .NET 4.0+:

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

Comment appeler:

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

Sortie:

Test vide () (FILENAME.cs: 104)

Regardez ici!

Changez le format Console.WriteLine comme bon vous semble!

4
Jared Burrows

Si c'est dans un bloc catch try, utilisez ceci.

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

Dans .NET 4.5, vous pouvez obtenir le numéro de ligne en créant la fonction:

static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
    return lineNumber; 
}

Ensuite, chaque fois que vous appelez LineNumber(), vous aurez la ligne actuelle. Cela présente l’avantage, par rapport à toute solution utilisant StackTrace, de fonctionner aussi bien en mode débogage qu’en version.

Donc, en prenant la demande initiale de ce qui est requis, cela deviendrait:

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

Ceci s'appuie sur l'excellente réponse de Marc Gravell.

1
Brian Cryer