有没有办法在C#的Console.WriteLine
函数中包含行号和文件名?
例如,在文件“myClass.cs”的第115行,我有声明
Console.WriteLine("Hello world");
我希望输出为:
[myClass.cs][115]: Hello world
答案 0 :(得分:15)
如果您使用的是C#5,则可以使用caller information attributes执行此操作。例如:
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之前,您会遇到执行时堆栈检查,由于内联而不太可靠,并且依赖于执行时存在的信息。 (例如,它可能不在发布版本中,而上述内容仍然有效。)
答案 1 :(得分:1)
您可以使用this constructor检查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();
答案 2 :(得分:0)
我会为此创建一个帮助方法,并利用Marc Gravell在这篇文章中写到的解决方案: How do I get the current line number?
像...一样的东西。
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.");