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?
c#
wpf
c#-4.0
line-numbers
MonsterMMORPG
sumber
sumber
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:
Ini akan menampilkan, misalnya:
Ada juga
[CallerFilePath]
yang memberi tahu Anda jalur file kode asli.sumber
Gunakan metode StackFrame.GetFileLineNumber , misalnya:
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:
Argumen harus
string
untukCallerMemberName
danCallerFilePath
danint
untukCallerLineNumber
dan 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.sumber
StackFrame
contoh di Mono , pastikan untuk menggunakan--debug
pada waktu kompilasi dan waktu prosesStackFrame
tidak tersedia di .NET Core. Gunakan jawaban Marc Gravell.= string.Empty
akan memunculkan error "Nilai parameter default untuk 'callingFilePath' harus berupa konstanta waktu kompilasi" !""
) sebagai gantistring.Empty
.Saya lebih suka satu liner jadi:
sumber
Bagi mereka yang membutuhkan solusi metode .NET 4.0+:
Bagaimana cara menelepon:
Keluaran:
Ubah format Console.WriteLine sesuka Anda!
sumber
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.
sumber
Di .NET 4.5 Anda bisa mendapatkan nomor baris dengan membuat fungsi:
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:
Ini membangun jawaban luar biasa dari Marc Gravell.
sumber