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

mLa*_*Lar 3 c# visual-studio

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

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

Console.WriteLine("Hello world");
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

[myClass.cs][115]:  Hello world 
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 15

如果您使用的是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");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Test.cs (16): Hello, world
Test.cs (17): This is the next line
Run Code Online (Sandbox Code Playgroud)

在C#5之前,你会遇到执行时堆栈检查,由于内联而不太可靠,并且依赖于执行时存在的信息.(例如,它可能不在发布版本中,而上述内容仍然有效.)

  • +1这是一个*非常*整洁的技巧 (2认同)
  • 值得注意的是**编译器**正在使用这些属性进行繁重的工作.如果您使用的是C#5*编译器*,即使针对以前的框架版本(或没有这些版本的版本),您也可以拥有这些属性的优点.例如,您可能正在为Portable Framework创建MVVM项目并希望使用`CallerMemberNameAttribute`,但在该版本的System.Runtime.CompilerServices中不存在它.如果手动创建属性并使用它,编译器仍将遵循并实现它. (2认同)