如何包含行号和文件名Console.WriteLine输出?

时间:2014-01-22 18:15:06

标签: c# visual-studio

有没有办法在C#的Console.WriteLine函数中包含行号和文件名?

例如,在文件“myClass.cs”的第115行,我有声明

Console.WriteLine("Hello world");

我希望输出为:

[myClass.cs][115]:  Hello world 

3 个答案:

答案 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文件可用于应用程序。

http://social.msdn.microsoft.com/Forums/en-US/a58dc2a0-0612-407b-8cbe-10f1784ba85a/how-to-retreive-the-line-number-and-file-name-of-c-source-code?forum=csharplanguage

来自链接的修改代码:

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.");