Hier ist ein Beispiel dafür, was ich tun möchte:
MessageBox.Show("Error line number " + CurrentLineNumber);
Im obigen Code wird die CurrentLineNumber
sollte die Zeilennummer im Quellcode dieses Teils des Codes sein.
Wie kann ich das tun?
Hier ist ein Beispiel dafür, was ich tun möchte:
MessageBox.Show("Error line number " + CurrentLineNumber);
Im obigen Code wird die CurrentLineNumber
sollte die Zeilennummer im Quellcode dieses Teils des Codes sein.
Wie kann ich das tun?
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:
using System.Runtime.CompilerServices;
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 + ")");
}
So wird zum Beispiel angezeigt:
Boo in Zeile 39 (SomeMethodSomewhere)
Außerdem gibt es [CallerFilePath]
die Ihnen 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());
}
Voir Scott Hanselman's Blog-Eintrag をご覧ください。
[Bearbeiten: Folgendes hinzugefügt]
Diejenigen, die .Net 4.5 oder höher verwenden, sollten die CallerFilePath , CallerMethodName y CallerLineNumber Attribute im Namespace System.Runtime.CompilerServices. Zum Beispiel:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Die Argumente müssen sein string
pour CallerMemberName
y CallerFilePath
und ein int
pour CallerLineNumber
und muss einen Standardwert haben. Durch die Angabe dieser Attribute bei Methodenparametern wird der Compiler angewiesen, den entsprechenden Wert zur Kompilierungszeit in den aufrufenden Code einzufügen, d.h. er arbeitet durch Verschleierung. Siehe Informationen zum Anrufer をご覧ください。
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 wird jedes Mal, wenn Sie anrufen LineNumber()
erhalten Sie die aktuelle Zeile. Dies hat den Vorteil gegenüber jeder Lösung, die den StackTrace verwendet, dass es sowohl in Debug als auch in Release funktionieren sollte.
Wenn man also die ursprüngliche Forderung zugrunde legt, würde dies bedeuten:
MessageBox.Show("Error enter code here line number " + LineNumber());
Dies baut auf der ausgezeichneten Antwort von Marc Gravell auf.
Für diejenigen, die eine .NET 4.0+ Methode 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);
}
Wie Sie anrufen können:
void Test() {
Log("Look here!");
}
Salida:
Void Test()(FILENAME.cs:104)
Sehen Sie hier!
Ändern Sie das Format von Console.WriteLine, wie Sie möchten!
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.