Đây là một ví dụ về những gì tôi muốn làm:
MessageBox.Show("Error line number " + CurrentLineNumber);
Trong đoạn mã trên CurrentLineNumber
, phải là số dòng trong mã nguồn của đoạn mã này.
Làm thế nào tôi có thể làm điều đó?
Đây là một ví dụ về những gì tôi muốn làm:
MessageBox.Show("Error line number " + CurrentLineNumber);
Trong đoạn mã trên CurrentLineNumber
, phải là số dòng trong mã nguồn của đoạn mã này.
Làm thế nào tôi có thể làm điều đó?
Câu trả lời:
Trong .NET 4.5 / C # 5, bạn có thể yêu cầu trình biên dịch thực hiện công việc này cho bạn, bằng cách viết một phương thức tiện ích sử dụng các thuộc tính người gọi mới:
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 + ")");
}
Điều này sẽ hiển thị, ví dụ:
Boo ở dòng 39 (SomeMethodSomewhere)
Ngoài ra còn [CallerFilePath]
có nó cho bạn biết đường dẫn của tệp mã gốc.
Sử dụng phương thức StackFrame.GetFileLineNumber , ví dụ:
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
Xem mục Blog của Scott Hanselman để biết thêm thông tin.
[Chỉnh sửa: Đã thêm phần sau]
Đối với những người sử dụng .Net 4.5 trở lên, hãy xem xét các thuộc tính CallerFilePath , CallerMethodName và CallerLineNumber trong không gian tên System.Runtime.CompilerServices. Ví dụ:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Các đối số phải là string
for CallerMemberName
và CallerFilePath
và int
for CallerLineNumber
và phải có giá trị mặc định. Việc chỉ định các thuộc tính này trên các tham số phương thức hướng dẫn trình biên dịch chèn giá trị thích hợp vào mã đang gọi tại thời điểm biên dịch, nghĩa là nó hoạt động thông qua obfuscation. Xem Thông tin Người gọi để biết thêm thông tin.
StackFrame
ví dụ trên Mono , hãy chắc chắn để sử dụng--debug
tại thời gian biên dịch và tại thời gian chạy
StackFrame
không có sẵn trong .NET Core. Sử dụng câu trả lời của Marc Gravell.
= string.Empty
ném ra lỗi "Giá trị tham số mặc định cho 'callFilePath' phải là hằng số thời gian biên dịch" !
""
) thay vì string.Empty
.
Tôi thích một lớp lót nên:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
Đối với những người cần giải pháp phương pháp .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);
}
Cách gọi:
void Test() {
Log("Look here!");
}
Đầu ra:
Kiểm tra Void () (FILENAME.cs: 104)
Nhìn đây!
Thay đổi định dạng Console.WriteLine theo cách bạn muốn!
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
thì bạn có thể nhấp vào dòng trong cửa sổ đầu ra và được đưa đến dòng đó trong nguồn.
Nếu nó trong một khối try catch hãy sử dụng cái này.
try
{
//Do something
}
catch (Exception ex)
{
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
Trong .NET 4.5, bạn có thể lấy số dòng bằng cách tạo hàm:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
Sau đó, mỗi lần bạn gọi LineNumber()
bạn sẽ có dòng hiện tại. Điều này có lợi thế hơn bất kỳ giải pháp nào sử dụng StackTrace là nó sẽ hoạt động trong cả gỡ lỗi và phát hành.
Vì vậy, lấy yêu cầu ban đầu của những gì được yêu cầu, nó sẽ trở thành:
MessageBox.Show("Error enter code here line number " + LineNumber());
Điều này được xây dựng dựa trên câu trả lời xuất sắc của Marc Gravell.