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 ce morceau de code.

Comment puis je faire ça?

Dans .NET 4.5 / C # 5, vous pouvez obtenir que le compilateur effectue ce travail pour vous, en écrivant une méthode utilitaire utilisant les nouveaux atsortingbuts de l’appelant:

 static void SomeMethodSomewhere() { ShowMessage("Boo"); } ... static void ShowMessage(ssortingng message, [CallerLineNumber] int lineNumber = 0, [CallerMemberName] ssortingng 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 d’origine.

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

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

Voir l’article de Scott Hanselman sur le blog pour plus d’informations.

[Edit: Ajout du suivant]

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

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

Les arguments doivent être ssortingng pour CallerMemberName et CallerFilePath et int pour CallerLineNumber et doivent avoir une valeur par défaut. La spécification de ces atsortingbuts sur les parameters de la méthode indique au compilateur d’insérer la valeur appropriée dans le code d’appel au moment de la compilation, ce qui signifie qu’il fonctionne grâce à l’obscurcissement. Voir Informations sur l’appelant pour plus d’informations.

Je préfère un paquebot donc:

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

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(ssortingng message) { StackFrame stackFrame = new System.Diagnostics.StackTrace(1).GetFrame(1); ssortingng fileName = stackFrame.GetFileName(); ssortingng methodName = stackFrame.GetMethod().ToSsortingng(); 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 de nullité () (FILENAME.cs: 104)

Regardez ici!

Changez le format Console.WriteLine comme vous le souhaitez!

Si son dans un bloc 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()); } 

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

 static int LineNumber([System.Runtime.ComstackrServices.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 qu’elle devrait fonctionner à la fois dans le débogage et la publication.

Donc, en prenant la demande originale de ce qui est requirejs, cela deviendrait:

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

Cela s’appuie sur l’excellente réponse de Marc Gravell.

Cela fonctionne pour moi:

 try { //your code; } catch(Exception ex) { MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message); }