我如何获得当前行号?
这是我想要做的一个例子:
MessageBox.Show("Error line number "+CurrentLineNumber);
当前行号将是这段代码的源代码中的行号。
我怎样才能做到这一点?
在.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]
告诉你原始代码文件的path。
使用StackFrame.GetFileLineNumber方法,例如:
private static void ReportError(string message) { StackFrame callStack = new StackFrame(1, true); MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName() + ", Line: " + callStack.GetFileLineNumber()); }
请参阅Scott Hanselman的博客条目以获取更多信息。
[编辑:添加以下内容]
对于使用.Net 4.5或更高版本的用户,请考虑System.Runtime.CompilerServices命名空间中的CallerFilePath , CallerMethodName和CallerLineNumber属性。 例如:
public void TraceMessage(string message, [CallerMemberName] string callingMethod = string.Empty, [CallerFilePath] string callingFilePath = string.Empty, [CallerLineNumber] int callingFileLineNumber = 0) { // Write out message }
CallerMemberName
和CallerFilePath
的参数必须是string
,而CallerFilePath
的参数必须是int
,并且必须具有默认值。 在方法参数上指定这些属性指示编译器在编译时在调用代码中插入适当的值,这意味着它通过混淆处理。 有关更多信息,请参阅来电者信息。
我更喜欢一件衬衫,所以:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
对于需要.NET 4.0+方法解决scheme的用户:
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!"); }
输出:
无效testing()(FILENAME.cs:104)
看这里!
改变Console.WriteLine格式你喜欢什么!
如果它在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()); }
在.NET 4.5中,您可以通过创build函数来获取行号:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0) { return lineNumber; }
然后,每次调用LineNumber()
,都会有当前行。 这比任何使用StackTrace的解决scheme都有优势,它应该在debugging和发行版中都可以工作。
因此,采取什么要求的原始要求,将成为:
MessageBox.Show("Error enter code here line number " + LineNumber());
这正是Marc Gravell的出色答案。
这适用于我:
try { //your code; } catch(Exception ex) { MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message); }