如何在 Console.WriteLine 输出中包含行号和文件名? [重复]

问题描述 投票:0回答:3

有没有办法在 C# 的

Console.WriteLine
函数中包含行号和文件名?

例如,在文件“myClass.cs”的第 115 行,我有这样的语句

Console.WriteLine("Hello world");

我希望输出为:

[myClass.cs][115]:  Hello world 
c# visual-studio
3个回答
20
投票

如果您使用的是 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 之前,您必须进行执行时堆栈检查,由于内联,这种检查不太可靠,并且依赖于执行时存在的信息。 (例如,它可能不在发布版本中,而上面的内容仍然有效。)


0
投票

我将为此创建一个辅助方法,并利用 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.");

0
投票

您可以使用

this 构造函数
检查 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-源代码?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();
© www.soinside.com 2019 - 2024. All rights reserved.