考虑到调试数据文件可用(PDB)并使用System.Reflection或其他类似框架(如Mono.Cecil),如何以编程方式检索源文件名和类型或类型成员的行号声明.
例如,假设您已将此文件编译为程序集:
C:\ MyProject的\ Foo.cs
1: public class Foo 2: { 3: public string SayHello() 4: { 5: return "Hello"; 6: } 7: }
怎么做这样的事情:
MethodInfo methodInfo = typeof(Foo).GetMethod("SayHello"); string sourceFileName = methodInfo.GetSourceFile(); // ?? Does not exist! int sourceLineNumber = methodInfo.GetLineNumber(); // ?? Does not exist!
sourceFileName将包含"C:\ MyProject\Foo.cs",sourceLineNumber将等于3.
更新:System.Diagnostics.StackFrame
确实能够获取该信息,但仅限于当前执行调用堆栈的范围.这意味着必须首先调用该方法.我想获得相同的信息,但不调用类型成员.
最新方法:
private static void Log(string text, [CallerFilePath] string file = "", [CallerMemberName] string member = "", [CallerLineNumber] int line = 0) { Console.WriteLine("{0}_{1}({2}): {3}", Path.GetFileName(file), member, line, text); }
Framework API
在运行时填充参数(用特殊属性标记)的新增内容,请参阅我对此SO问题的回答