有没有办法在 C# 的
Console.WriteLine
函数中包含行号和文件名?
例如,在文件“myClass.cs”的第 115 行,我有这样的语句
Console.WriteLine("Hello world");
我希望输出为:
[myClass.cs][115]: Hello world
如果您使用的是 C# 5,则可以使用 来电者信息属性 来执行此操作。例如:
using System;
using System.IO;
using System.Runtime.CompilerServices;
public class Test
{
static void Log(string message,
[CallerFilePath] string file = null,
[CallerLineNumber] int line = 0)
{
Console.WriteLine("{0} ({1}): {2}", Path.GetFileName(file), line, message);
}
static void Main()
{
Log("Hello, world");
Log("This is the next line");
}
}
输出:
Test.cs (16): Hello, world
Test.cs (17): This is the next line
在 C# 5 之前,您必须进行执行时堆栈检查,由于内联,这种检查不太可靠,并且依赖于执行时存在的信息。 (例如,它可能不在发布版本中,而上面的内容仍然有效。)
我将为此创建一个辅助方法,并利用 Marc Gravell 在这篇文章中写的解决方案: 如何获取当前行号?
类似...
public static class WriteLineHelper
{
public static void WriteLine(string message,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
Console.WriteLine(string.Format("[{0}][{1}] : {2}, caller, lineNumber, message);
}
}
然后在 myClass.cs 中,只需将对 Console.WriteLine 的调用替换为:
WriteLineHelper.WriteLine("Hello world.");
您可以使用
this 构造函数检查
StackTrace
,从中获取 StackFrame
,然后在 GetFileName()
上调用 GetFileLineNumber()
和 StackFrame
。请注意,这需要应用程序提供 .pdb
文件。
链接中修改后的代码:
using System.Diagnostics;
var StackTrace = new System.Diagnostics.StackTrace(true);
var StackFrame = StackTrace.GetFrame(0);
string FileName = StackFrame.GetFileName();
string LineNumber = StackFrame.GetFileLineNumber().ToString();