Hier ist ein Beispiel dafür, was ich tun möchte:
MessageBox.Show("Error line number "+CurrentLineNumber);
Die aktuelle Zeilennummer ist die Zeilennummer im Quellcode dieses Codeteils.
Wie kann ich das machen?
In .NET 4.5/C # 5 können Sie den Compiler dazu bringen, diese Arbeit für Sie zu erledigen, indem Sie eine Dienstprogrammmethode schreiben, die die neuen Aufruferattribute verwendet:
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 + ")");
}
Dies zeigt zum Beispiel:
Boo in Zeile 39 (SomeMethodSomewhere)
Es gibt auch [CallerFilePath]
, das den Pfad der ursprünglichen Codedatei angibt.
Verwenden Sie die StackFrame.GetFileLineNumber -Methode, zum Beispiel:
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
Weitere Informationen finden Sie unter Scott Hanselmans Blogeintrag .
[Bearbeiten: Folgendes hinzugefügt]
Berücksichtigen Sie bei Verwendung von .Net 4.5 oder höher die Attribute CallerFilePath , CallerMethodName und CallerLineNumber im Namespace System.Runtime.CompilerServices. Beispielsweise:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Die Argumente müssen string
für CallerMemberName
und CallerFilePath
und ein int
für CallerLineNumber
sein und einen Standardwert haben. Wenn Sie diese Attribute in Methodenparametern angeben, wird der Compiler angewiesen, zur Kompilierungszeit den entsprechenden Wert in den aufrufenden Code einzufügen, was bedeutet, dass die Verschleierung durchgeführt wird. Weitere Informationen finden Sie unter Anruferinformationen .
Ich bevorzuge einen Liner, also:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
Für diejenigen, die eine .NET 4.0+ Methodenlösung benötigen:
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);
}
So rufen Sie an:
void Test() {
Log("Look here!");
}
Ausgabe:
Ungültigkeitstest () (FILENAME.cs: 104)
Schau hier!
Ändern Sie das Console.WriteLine-Format nach Ihren Wünschen!
Wenn es in einem try catch Block ist, benutze dies.
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 können Sie die Zeilennummer erhalten, indem Sie die Funktion erstellen:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
Dann haben Sie bei jedem Aufruf von LineNumber()
die aktuelle Zeile. Dies hat gegenüber jeder Lösung, die StackTrace verwendet, den Vorteil, dass es sowohl im Debug- als auch im Release-Modus funktioniert.
Nehmen wir also die ursprüngliche Anforderung von dem, was erforderlich ist, so wird dies:
MessageBox.Show("Error enter code here line number " + LineNumber());
Dies baut auf der hervorragenden Antwort von Marc Gravell auf.