如何获得当前行号?(How do I get the current line number?)

2019-06-18 06:56发布

下面是我想要做的一个例子:

 MessageBox.Show("Error line number "+CurrentLineNumber);

当前行号将在这一段代码的源代码的行号。

我怎样才能做到这一点?

Answer 1:

在.NET 4.5 / C#5,你可以让编译器做这个工作对你来说,通过编写使用新呼叫者属性的实用工具方法:

static void SomeMethodSomewhere()
{
    ShowMessage("Boo");
}
...
static void ShowMessage(string message,
    [CallerLineNumber] int lineNumber = 0,
    [CallerMemberName] string caller = null)
{
     MessageBox.Show(message + " at line " + lineNumber + " (" + caller + ")");
}

这将显示,例如:

在管线39 BOO(SomeMethodSomewhere)

还有[CallerFilePath]告诉你的原代码文件的路径。



Answer 2:

使用StackFrame.GetFileLineNumber方法,例如:

private static void ReportError(string message)
{
     StackFrame callStack = new StackFrame(1, true);
     MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName() 
          + ", Line: " + callStack.GetFileLineNumber());
}

见斯科特Hanselman的博客文章以了解更多信息。

[编辑:添加下述]

对于使用.NET 4.5或更高版本的,考虑CallerFilePath , CallerMethodName和CallerLineNumber在System.Runtime.CompilerServices命名空间属性。 例如:

public void TraceMessage(string message,
        [CallerMemberName] string callingMethod = string.Empty,
        [CallerFilePath] string callingFilePath = string.Empty,
        [CallerLineNumber] int callingFileLineNumber = 0)
{
    // Write out message
}

该参数必须是stringCallerMemberNameCallerFilePathintCallerLineNumber并且必须有一个默认值。 指定的方法参数这些属性指示编译器插入在编译时调用代码中适当的值,这意味着它的工作原理,通过混淆。 见来电信息以获取更多信息。



Answer 3:

我更喜欢一个衬垫这样:

int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();


Answer 4:

对于那些谁需要一个.NET 4.0以上版本的方法解决:

using System;
using System.IO;
using System.Diagnostics;

public static void Log(string message) {
   StackFrame stackFrame = new System.Diagnostics.StackTrace(1).GetFrame(1);
   string fileName = stackFrame.GetFileName();
   string methodName = stackFrame.GetMethod().ToString();
   int lineNumber = stackFrame.GetFileLineNumber();

   Console.WriteLine("{0}({1}:{2})\n{3}", methodName, Path.GetFileName(fileName), lineNumber, message);
}

如何调用:

void Test() {
   Log("Look here!");
}

输出:

空隙测试()(FILENAME.cs:104)

看这里!

更改Console.WriteLine命令格式,你怎么样!



Answer 5:

如果它在一个try catch块使用。

try
{
    //Do something
}
catch (Exception ex)
{
    System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
    Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}


Answer 6:

在.NET 4.5,你可以通过创建函数得到行号:

static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
    return lineNumber; 
}

然后每次调用LineNumber()您将拥有当前行。 这样做的好处在使用堆栈跟踪,它应该在这两个调试和发布工作,任何解决方案。

因此,采取什么是需要的原始请求,它会成为:

MessageBox.Show("Error enter code here line number " + LineNumber());

这是建立在由Marc Gravell的出色答卷。



Answer 7:

这对我的作品:

try
{
 //your code;
}
catch(Exception ex)
{
  MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message);
}


文章来源: How do I get the current line number?