我想在调用方法级别向记录器添加更多信息,我需要知道是否有可能在调用方法中调用 StackTrace 方法调用。
UPDATE:这样做的目的是绘制调用所有方法的流程,直到调用方法中的某个步骤为止。
示例:
public class Type1
{
internal string method2_T1() {
return new Type2().method1_T2();
}
}
public class Type2
{
public string method1_T2()
{
return "Type2.method1_T2";
}
}
static void Main(string[] args)
{
string t = new Type1().method2_T1();
LogNow();
....
}
,当我打电话给 LogNow()时,获得的结果是:
方法2_T1()的StackTrace
...
由于
答案 0 :(得分:0)
这很简单:
var stackTrace = new StackTrace(true);
var traceToLog = stackTrace.ToString();
true
参数表示包含文件信息。
答案 1 :(得分:0)
Todd Sprang的回答很好,但请注意,当您转移到RELEASE版本或使用async / await时,堆栈跟踪将以不可预测的方式发生变化。不要以编程方式依赖答案,因为当您将代码投入生产时,您可能会失败。
答案 2 :(得分:0)
如果您想以微软推荐的方式了解特定功能的直接来电者,那么使用[CallerMemberName]
,[CallerFilePath]
和[CallerLineNumber]
属性就是有用的技巧。标记可选参数,如此;
public void LogWithCallerInfo(
string message,
[CallerMemberName] string memberName = "Caller",
[CallerFilePath] string sourceFilePath = "File",
[CallerLineNumber] int sourceLineNumber = 0)
{
WriteProgressMessage(..., memberName, sourceFilePath, sourceLineNumber);
}
并像这样打电话;
LogWithCallerInfo("my message");
三个可选参数将替换为相应的呼叫信息。