如何获取当前行号?

Mon*_*RPG 110 c# wpf line-numbers c#-4.0

这是我想要做的一个例子:

 MessageBox.Show("Error line number "+CurrentLineNumber);
Run Code Online (Sandbox Code Playgroud)

当前行号将是此段代码的源代码中的行号.

我怎样才能做到这一点?

Mar*_*ell 163

在.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 + ")");
}
Run Code Online (Sandbox Code Playgroud)

这将显示,例如:

第39行的Boo(SomeMethodSomewhere)

还有[CallerFilePath]一个告诉你原始代码文件的路径.

  • C#设计得很好.它永远不会让我感到惊讶.谢谢马克! (4认同)

akt*_*ton 68

使用StackFrame.GetFileLineNumber方法,例如:

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

有关更多信息,请参阅Scott Hanselman的博客条目.

[编辑:添加以下内容]

对于使用.Net 4.5或更高版本的用户,请考虑System.Runtime.CompilerServices命名空间中的CallerFilePath,CallerMethodNameCallerLineNumber属性.例如:

public void TraceMessage(string message,
        [CallerMemberName] string callingMethod = "",
        [CallerFilePath] string callingFilePath = "",
        [CallerLineNumber] int callingFileLineNumber = 0)
{
    // Write out message
}
Run Code Online (Sandbox Code Playgroud)

参数必须stringCallerMemberNameCallerFilePathintCallerLineNumber,必须有一个默认值.在方法参数上指定这些属性指示编译器在编译时在调用代码中插入适当的值,这意味着它通过模糊处理来工作.有关详细信息,请参阅来电者信息.

  • 如果要在** Mono上编译`StackFrame`示例,请确保在编译时和运行时**使用`--debug` ** (2认同)

iam*_*eed 17

我更喜欢一个衬垫:

int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
Run Code Online (Sandbox Code Playgroud)

  • 它需要.pdb文件..我们通常不会生成/复制到生产服务器. (7认同)

Bri*_*yer 7

在.NET 4.5中,您可以通过创建函数来获取行号:

static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
    return lineNumber; 
}
Run Code Online (Sandbox Code Playgroud)

然后每次打电话时LineNumber()您都会看到当前线路。与使用 StackTrace 的任何解决方案相比,它的优点是它可以在调试和发布中工作。

因此,考虑到所需内容的原始请求,它将变为:

MessageBox.Show("Error enter code here line number " + LineNumber());
Run Code Online (Sandbox Code Playgroud)

这是建立在马克·格拉维尔(Marc Gravell)的出色回答的基础上的。