Ecco un esempio di quello che voglio fare:
MessageBox.Show("Error line number " + CurrentLineNumber);
Nel codice sopra CurrentLineNumber
, dovrebbe essere il numero di riga nel codice sorgente di questo pezzo di codice.
Come lo posso fare?
Ecco un esempio di quello che voglio fare:
MessageBox.Show("Error line number " + CurrentLineNumber);
Nel codice sopra CurrentLineNumber
, dovrebbe essere il numero di riga nel codice sorgente di questo pezzo di codice.
Come lo posso fare?
Risposte:
In .NET 4.5 / C # 5, puoi fare in modo che il compilatore esegua 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.
Utilizza 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());
}
Per ulteriori informazioni, vedere la voce del blog di Scott Hanselman .
[Modifica: aggiunto quanto segue]
Per coloro che utilizzano .Net 4.5 o versioni successive, considera gli attributi CallerFilePath , CallerMethodName e CallerLineNumber nello spazio dei nomi System.Runtime.CompilerServices. Per esempio:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Gli argomenti devono essere string
for CallerMemberName
and CallerFilePath
and an int
for CallerLineNumber
e devono avere un valore predefinito. La specifica di questi attributi sui parametri del metodo indica al compilatore di inserire il valore appropriato nel codice chiamante in fase di compilazione, il che significa che funziona tramite offuscamento. Vedere Informazioni sul chiamante per ulteriori informazioni.
StackFrame
esempio su Mono , assicurati di usarlo--debug
in fase di compilazione e in fase di esecuzione
StackFrame
non è disponibile in .NET Core. Usa la risposta di Marc Gravell.
= string.Empty
genera l'errore "Il valore del parametro predefinito per 'callingFilePath' deve essere una costante in fase di compilazione" !
""
) invece di string.Empty
.
Preferisco una riga quindi:
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 preferisci!
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
puoi fare clic sulla riga nella finestra di output ed essere portato a quella riga nel sorgente.
Se è in un blocco try catch, usa 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 è possibile ottenere il numero di riga creando la funzione:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
Quindi ogni volta che chiami LineNumber()
avrai la linea corrente. Questo ha il vantaggio rispetto a qualsiasi soluzione che utilizza StackTrace che dovrebbe funzionare sia nel debug che nel rilascio.
Quindi, prendendo la richiesta originale di ciò che è richiesto, diventerebbe:
MessageBox.Show("Error enter code here line number " + LineNumber());
Ciò si basa sull'eccellente risposta di Marc Gravell.