这是我想做的一个例子:
MessageBox.Show("Error line number " + CurrentLineNumber);
在上方的代码中CurrentLineNumber
,应该是这段代码的源代码中的行号。
我怎样才能做到这一点?
这是我想做的一个例子:
MessageBox.Show("Error line number " + CurrentLineNumber);
在上方的代码中CurrentLineNumber
,应该是这段代码的源代码中的行号。
我怎样才能做到这一点?
Answers:
在.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]
可以告诉您原始代码文件的路径。
使用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的Blog条目。
[编辑:添加以下内容]
对于使用.Net 4.5或更高版本的用户,请考虑System.Runtime.CompilerServices命名空间中的CallerFilePath,CallerMethodName和CallerLineNumber属性。例如:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
参数必须是string
for CallerMemberName
和and CallerFilePath
且int
for CallerLineNumber
和必须具有默认值。在方法参数上指定这些属性会指示编译器在编译时在调用代码中插入适当的值,这意味着它可以通过混淆来工作。有关更多信息,请参见呼叫者信息。
StackFrame
的例子单时,一定要使用--debug
在编译时和运行时
StackFrame
在.NET Core中不可用。使用马克·格雷韦尔的答案。
= string.Empty
将引发错误“'callingFilePath'的默认参数值必须是编译时常量”!
""
)代替string.Empty
。
对于那些需要.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的格式!
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
则可以在输出窗口中单击该行,并转到源代码中的该行。
在.NET 4.5中,您可以通过创建以下函数来获取行号:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
这样,每次您拨打电话时,LineNumber()
您都会拥有当前线路。与使用StackTrace的任何解决方案相比,这具有优势,它可以同时在调试和发布中工作。
因此,以原始要求为前提,它将变成:
MessageBox.Show("Error enter code here line number " + LineNumber());
这是基于Marc Gravell的出色回答。