İşte yapmak istediğim şeye bir örnek:
MessageBox.Show("Error line number " + CurrentLineNumber);
Yukarıdaki CurrentLineNumber
kodda, bu kod parçasının kaynak kodundaki satır numarası olmalıdır.
Bunu nasıl yapabilirim?
İşte yapmak istediğim şeye bir örnek:
MessageBox.Show("Error line number " + CurrentLineNumber);
Yukarıdaki CurrentLineNumber
kodda, bu kod parçasının kaynak kodundaki satır numarası olmalıdır.
Bunu nasıl yapabilirim?
Yanıtlar:
.NET 4.5 / C # 5'te, yeni arayan özniteliklerini kullanan bir yardımcı program yöntemi yazarak derleyicinin bu işi sizin için yapmasını sağlayabilirsiniz:
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 + ")");
}
Bu, örneğin şunu gösterecektir:
39. satırda Boo (SomeMethodSomewhere)
Ayrıca [CallerFilePath]
size orijinal kod dosyasının yolunu söyleyenler de var .
StackFrame.GetFileLineNumber yöntemini kullanın, örneğin:
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
Daha fazla bilgi için Scott Hanselman'ın Blog girişine bakın.
[Düzenle: Aşağıdakileri ekledi]
.Net 4.5 veya üzerini kullananlar için, System.Runtime.CompilerServices ad alanındaki CallerFilePath , CallerMethodName ve CallerLineNumber özniteliklerini göz önünde bulundurun . Örneğin:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Argümanlar string
for CallerMemberName
ve CallerFilePath
ve int
for CallerLineNumber
olmalıdır ve varsayılan bir değere sahip olmalıdır. Yöntem parametrelerinde bu özniteliklerin belirtilmesi, derleyiciye çağıran koda uygun değeri derleme zamanında ekleme talimatı verir, yani gizleme yoluyla çalışır. Daha fazla bilgi için Arayan Bilgileri'ne bakın .
StackFrame
örneğe Mono , emin için olmak kullanmak--debug
derleme zamanında ve çalışma zamanında
StackFrame
.NET Core'da mevcut değildir. Marc Gravell'in cevabını kullanın.
= string.Empty
hatası verir !
""
yerine çift tırnak ( ) kullanacak şekilde değiştirdim string.Empty
.
Ben bir gömlek tercih ederim, bu yüzden:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
.NET 4.0+ yöntem çözümüne ihtiyaç duyanlar için:
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);
}
Nasıl aranır:
void Test() {
Log("Look here!");
}
Çıktı:
Geçersizlik Testi () (FILENAME.cs: 104)
Buraya bak!
Console.WriteLine formatını istediğiniz gibi değiştirin!
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
çıktı penceresindeki satırı tıklayabilir ve kaynakta o satıra götürülebilirsiniz.
Bir deneme yakalama bloğu ise bunu kullanın.
try
{
//Do something
}
catch (Exception ex)
{
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
.NET 4.5'te, işlevi oluşturarak satır numarasını alabilirsiniz:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
Daha sonra her aradığınızda LineNumber()
mevcut hattınız olacak. Bu, hem hata ayıklamada hem de yayınlamada çalışması gereken StackTrace'i kullanan herhangi bir çözüme göre avantajlıdır.
Böylece, gerekli olanın orijinal talebini alırsanız, şu olur:
MessageBox.Show("Error enter code here line number " + LineNumber());
Bu, Marc Gravell'in mükemmel cevabına dayanıyor.