在项目中有需求打印出当前函数调用处的行数,C++中可以用“__FILE__ and __LINE__”这个宏,那么在C#中应该如何实现类似的功能呢?
C#中提供了StackFrame这个类,通过调用它的方法即可简单的获得当前执行函数所在文件,以及在文件里的对应行数。
代码如下:
public static void WriteLog(String msg)
{
StackFrame CallStack = new StackFrame(1, true);
String SourceFile = CallStack.GetFileName();
int lineNum = CallStack.GetFileLineNumber();
WriteContent(msg, SourceFile, lineNum);
}
StatckFrame的构造函数中1代表堆栈上要跳过的帧数,也即用于构造StackFrame的帧当前指向了调用WriteLog这个方法的帧,true表示要捕获堆栈帧的文件名、行号和列号,如下图:

这样获得了函数堆栈上正确的帧数之后,就可以通过调用StackFrame 中的GetLineNumber等函数获得你想要的信息了。
ps:注意StackFrame需要有PDB Files的支持。
ps1:最后再来首歌,挺好听的,还有爱熊行动
