考虑到调试数据文件可用(PDB)并使用System.Reflection或其他类似框架(如Mono.Cecil),如何以编程方式检索源文件名和类型或类型成员的行号声明.
例如,假设您已将此文件编译为程序集:
C:\ MyProject的\ Foo.cs
1: public class Foo
2: {
3: public string SayHello()
4: {
5: return "Hello";
6: }
7: }
Run Code Online (Sandbox Code Playgroud)
怎么做这样的事情:
MethodInfo methodInfo = typeof(Foo).GetMethod("SayHello");
string sourceFileName = methodInfo.GetSourceFile(); // ?? Does not exist!
int sourceLineNumber = methodInfo.GetLineNumber(); // ?? Does not exist!
Run Code Online (Sandbox Code Playgroud)
sourceFileName将包含"C:\ MyProject\Foo.cs",sourceLineNumber将等于3.
更新:System.Diagnostics.StackFrame确实能够获取该信息,但仅限于当前执行调用堆栈的范围.这意味着必须首先调用该方法.我想获得相同的信息,但不调用类型成员.
ill*_*ant 10
最新方法:
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);
}
Run Code Online (Sandbox Code Playgroud)
Framework API在运行时填充参数(用特殊属性标记)的新增内容,请参阅我对此SO问题的回答
Ric*_*ard -2
您可能会通过这些链接找到一些帮助:
在不部署 PDB 文件的情况下获取文件和行号 还发现了以下帖子
“嗨,马克,
以下将为您提供代码的行号(在源文件中):
Dim CurrentStack As System.Diagnostics.StackTrace
MsgBox (CurrentStack.GetFrame(0).GetFileLineNumber)
Run Code Online (Sandbox Code Playgroud)
如果您感兴趣,您可以了解您所在的例程及其所有调用者。
Public Function MeAndMyCaller As String
Dim CurrentStack As New System.Diagnostics.StackTrace
Dim Myself As String = CurrentStack.GetFrame(0).GetMethod.Name
Dim MyCaller As String = CurrentStack.GetFrame(1).GetMethod.Name
Return "In " & Myself & vbCrLf & "Called by " & MyCaller
End Function
Run Code Online (Sandbox Code Playgroud)
如果您想要一个通用的错误例程,这会非常方便,因为它可以获取调用者的名称(这将是发生错误的位置)。
此致,Fergus MVP [Windows 开始按钮、关机对话框] ”