考虑到调试数据文件可用(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
确实能够获取该信息,但仅限于当前执行调用堆栈的范围。这意味着必须首先调用该方法。我想获得相同的信息,但不需要调用类型成员。
答案 0 :(得分:11)
最新方法:
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
在运行时填充参数(标有特殊属性),
在my answer to this SO question
答案 1 :(得分:1)
您可以通过以下链接找到一些帮助:
Getting file and line numbers without deploying the PDB files 还发现以下post
“嗨马克,
以下内容将为您提供代码的行号(在 源文件):
Dim CurrentStack As System.Diagnostics.StackTrace
MsgBox (CurrentStack.GetFrame(0).GetFileLineNumber)
如果您感兴趣,可以了解您的常规 in,以及所有来电者。
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
如果你想要一个通用的错误例程,这可能非常方便 可以获取调用者的名称(这将是发生错误的位置)。
此致 弗格斯 MVP [Windows开始按钮,关机对话] “
答案 2 :(得分:1)
使用上面解释的方法之一,在属性的构造函数中,您可以提供可能具有属性的所有内容的源位置 - 例如类。请参阅以下属性类:
sealed class ProvideSourceLocation : Attribute
{
public readonly string File;
public readonly string Member;
public readonly int Line;
public ProvideSourceLocation
(
[CallerFilePath] string file = "",
[CallerMemberName] string member = "",
[CallerLineNumber] int line = 0)
{
File = file;
Member = member;
Line = line;
}
public override string ToString() { return File + "(" + Line + "):" + Member; }
}
[ProvideSourceLocation]
class Test
{
...
}
你可以写一下:
Console.WriteLine(typeof(Test).GetCustomAttribute<ProvideSourceLocation>(true));
输出将是:
a:\develop\HWClassLibrary.cs\src\Tester\Program.cs(65):