gpt4 book ai didi

c# - 如何在不使用 CallerInfo 属性的情况下获取 CallerFilePath 和 CallerLineNumber?

转载 作者:太空狗 更新时间:2023-10-29 21:22:16 25 4
gpt4 key购买 nike

对于我的 log4net 解决方案,我有一个使用 CallerInfo 属性的 API 包装器,例如

    public void Write(string message,
[CallerMemberName] string memberName = "",
[CallerFilePath] string filePath = "",
[CallerLineNumber] int lineNumber = 0)

但是,我也在使用 Unity Interception,这样我就可以执行响应之前/之后的跟踪记录,例如在 Invoke 方法中使用如下所示的 ICallHandler。

public class TraceCallHandler : ICallHandler
{
...

public IMethodReturn Invoke(IMethodInvocation input,
GetNextHandlerDelegate getNext)
{
//---- Trace method inputs
this.LogInfoBeforeInvoke(input);

//---- invoking the target method
InvokeHandlerDelegate next = getNext();
IMethodReturn methodReturn = next(input, getNext);

//---- invoking the target method
this.LogInfoAfterInvoke(methodReturn.ReturnValue);
}
}

注意:以上代码绝不是完整/正确的...但只是想向您展示我为 Unity Interception 所做的工作。

我的问题/挑战是:当我最终调用 log.Write(...) 时,我想要目标的调用者信息,而不是我的 TraceCallHandler 信息。

例如对于方法名称,我可以这样做:

   string methodName = input.MethodBase.Name;

如何获取来电者的文件路径和来电者的线路号码?甚至可以通过反射来做吗?

谢谢!

最佳答案

是的,你可以使用反射获得这些:

var sf = new System.Diagnostics.StackTrace(1).GetFrame(0);
Console.WriteLine(" File: {0}", sf.GetFileName());
Console.WriteLine(" Line Number: {0}", sf.GetFileLineNumber());
// Note that the column number defaults to zero
// when not initialized.
Console.WriteLine(" Column Number: {0}", sf.GetFileColumnNumber());

然而,正如它在 the documentation 中明确指出的那样:

StackFrame information will be most informative with Debug build configurations. By default, Debug builds include debug symbols, while Release builds do not. The debug symbols contain most of the file, method name, line number, and column information used in constructing StackFrame objects.

因此,如果您想要的只是调试,那么请在调试版本中启用它并注销。在 Release 版本中,尽管它充其量是无用的,最坏的情况是完全误导,因为除了上面的符号注意事项之外,编译器会积极地内联方法和重新排序,并且通常会弄乱你的东西。

关于c# - 如何在不使用 CallerInfo 属性的情况下获取 CallerFilePath 和 CallerLineNumber?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com