- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于我的 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/
[CallerLineNumber] 是一项很棒的语言功能。但我用它来 automatically order class properties as their declaration order
使用CallerMemberName/CallerFilePathAttribute/CallerLineNumber属性如何影响应用程序的性能?这是在应用程序中编译的东西,还是相关反射的东西,还是其
对于我的 log4net 解决方案,我有一个使用 CallerInfo 属性的 API 包装器,例如 public void Write(string message,
我是一名优秀的程序员,十分优秀!