Berikut adalah contoh yang ingin saya lakukan:
MessageBox.Show("Error line number " + CurrentLineNumber);
Dalam kode di atas CurrentLineNumber, harus menjadi nomor baris dalam kode sumber dari bagian kode ini.
Bagaimana saya bisa melakukan itu?
Berikut adalah contoh yang ingin saya lakukan:
MessageBox.Show("Error line number " + CurrentLineNumber);
Dalam kode di atas CurrentLineNumber, harus menjadi nomor baris dalam kode sumber dari bagian kode ini.
Bagaimana saya bisa melakukan itu?
Jawaban:
Di .NET 4.5 / C # 5, Anda bisa meminta kompiler untuk melakukan pekerjaan ini untuk Anda, dengan menulis metode utilitas yang menggunakan atribut pemanggil baru:
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 + ")");
}
Ini akan menampilkan, misalnya:
Boo di baris 39 (SomeMethodSomewhere)
Ada juga [CallerFilePath]yang memberi tahu Anda jalur file kode asli.
Gunakan metode StackFrame.GetFileLineNumber , misalnya:
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
Lihat entri Blog Scott Hanselman untuk informasi lebih lanjut.
[Edit: Menambahkan berikut ini]
Bagi mereka yang menggunakan .Net 4.5 atau lebih baru, pertimbangkan atribut CallerFilePath , CallerMethodName dan CallerLineNumber di namespace System.Runtime.CompilerServices. Sebagai contoh:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Argumen harus stringuntuk CallerMemberNamedan CallerFilePathdan intuntuk CallerLineNumberdan harus memiliki nilai default. Menentukan atribut ini pada parameter metode menginstruksikan compiler untuk memasukkan nilai yang sesuai dalam kode panggilan pada waktu kompilasi, yang berarti ia bekerja melalui obfuscation. Lihat Informasi Penelepon untuk informasi lebih lanjut.
StackFramecontoh di Mono , pastikan untuk menggunakan--debug pada waktu kompilasi dan waktu proses
StackFrametidak tersedia di .NET Core. Gunakan jawaban Marc Gravell.
= string.Emptyakan memunculkan error "Nilai parameter default untuk 'callingFilePath' harus berupa konstanta waktu kompilasi" !
"") sebagai ganti string.Empty.
Saya lebih suka satu liner jadi:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
Bagi mereka yang membutuhkan solusi metode .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);
}
Bagaimana cara menelepon:
void Test() {
Log("Look here!");
}
Keluaran:
Void Test () (FILENAME.cs: 104)
Lihat di sini!
Ubah format Console.WriteLine sesuka Anda!
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));maka Anda dapat mengklik baris di jendela keluaran dan dibawa ke baris tersebut di sumber.
Jika dalam mencoba menangkap blok gunakan ini.
try
{
//Do something
}
catch (Exception ex)
{
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
Di .NET 4.5 Anda bisa mendapatkan nomor baris dengan membuat fungsi:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
Kemudian setiap kali Anda menelepon, LineNumber()Anda akan mendapatkan saluran saat ini. Ini memiliki keunggulan dibandingkan solusi apa pun yang menggunakan StackTrace yang seharusnya berfungsi baik di debug maupun rilis.
Jadi mengambil permintaan asli dari apa yang dibutuhkan, itu akan menjadi:
MessageBox.Show("Error enter code here line number " + LineNumber());
Ini membangun jawaban luar biasa dari Marc Gravell.