Come ottengo il numero di linea corrente?

Ecco un esempio di ciò che voglio fare:

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

Il numero di riga corrente sarà il numero di riga nel codice sorgente di questo pezzo di codice.

Come lo posso fare?

In .NET 4.5 / C # 5, puoi fare in modo che il compilatore faccia questo lavoro per te, scrivendo un metodo di utilità che utilizza i nuovi attributi del chiamante:

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

Questo mostrerà, ad esempio:

Boo alla riga 39 (SomeMethodSomewhere)

C’è anche [CallerFilePath] che ti dice il percorso del file di codice originale.

Utilizzare il metodo StackFrame.GetFileLineNumber , ad esempio:

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

Vedi la voce Blog di Scott Hanselman per ulteriori informazioni.

[Modifica: Aggiunto il seguente]

Per coloro che utilizzano .Net 4.5 o versioni successive, considerare gli attributi CallerFilePath , CallerMethodName e CallerLineNumber nello spazio dei nomi System.Runtime.CompilerServices. Per esempio:

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

Gli argomenti devono essere string per CallerMemberName e CallerFilePath e un int per CallerLineNumber e devono avere un valore predefinito. Specificando questi attributi sui parametri del metodo si indica al compilatore di inserire il valore appropriato nel codice chiamante in fase di compilazione, il che significa che funziona attraverso l’offuscamento. Vedere Informazioni sul chiamante per ulteriori informazioni.

Preferisco una nave così:

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

Per coloro che necessitano di una soluzione di metodo .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); } 

Come chiamare:

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

Produzione:

Void Test () (FILENAME.cs: 104)

Guarda qui!

Cambia il formato Console.WriteLine come ti piace!

Se si trova in un blocco di cattura prova utilizzare questo.

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

In .NET 4.5 è ansible ottenere il numero di linea creando la funzione:

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

Quindi, ogni volta che si chiama LineNumber() si avrà la riga corrente. Questo ha il vantaggio su qualsiasi soluzione che utilizza StackTrace che dovrebbe funzionare sia in fase di debug che di rilascio.

Quindi, prendendo la richiesta originale di ciò che è richiesto, diventerebbe:

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

Questo sta prendendo le mosse dall’eccellente risposta di Marc Gravell.

Questo funziona per me:

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