从派生类传递StackFrame堆栈跟踪

时间:2016-02-06 15:29:12

标签: c# debugging design-patterns stackframe

我有一个接受StackFrame参数的基类。

public ExcpM(string Msg, StackFrame parCallStack = null, bool show = true)
{
    StackFrame LcallStack;
    if (parCallStack == null)
       LcallStack= new StackFrame(1, true);
    else LcallStack= parCallStack;

        //do stuff with info in LcallStack ..
}

最初我是在没有上述参数的情况下开始的,我添加了它是因为 当使用常见的Extension方法或任何调用上述构造函数的方法时, 如果没有添加参数callStack.GetMethod(),则会给出扩展方法数据,而不是我想要的那个调用者。

现在我把它称为一种解决方案,出现了一个新的问题,即我没有适当的解决方案,这让我觉得我错误地使用它。

问题是当我从上面的ExcpM主类创建派生类时 这也给出了错误的人数据(派生自己的ctor ..)

派生(为布尔方法使用添加了错误的返回值)

public class ExcpFlsV:ExcpM
{
    bool Rtrn { get { return false; } }
    public ExcpFlsV(string bsMsg, StackFrame bsCallStack = null)
      : base(bsMsg, bsCallStack)
    {

    }
}

使用

public bool someMethodReturnsBool()
{
    //unless adding Local callStack field to every method passes ctor of ExcpFlsV as calling method
    StackFrame LcallStack = new System.Diagnostics.StackFrame(1, true);
    if(some condition no met) 
      return new ExcpFlsV("some error message...", LcallStack).Rtrn;
}

将调用者方法作为数据传递的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

public bool SecondLevel(string caller, int callerLvl = 2)
{
    return testStacktrace(" called by SecondLevel " + caller, callerLvl);
}
public bool testStacktraceFirstLvl(string caller, int callerLvl = 1)
{

    new ExcpM("testStacktrace " + caller, callerLvl); return false;

}

public ExcpM(string Msg,int CallerLevel=1, bool show = true)
{
    StackFrame callStack = new StackFrame(CallerLevel, true);
    this.lnNum = callStack.GetFileLineNumber();
    this.fl = callStack.GetFileName();
    this.mthod = callStack.GetMethod().Name;
    this.lMsg = Msg;
}

或派生(假版),跳过额外的堆栈框架

public class ExcpFlsV:ExcpM
{
    bool Rtrn { get { return false; } }
    public ExcpFlsV(string bsMsg, int CallerLevel=2)
        : base(bsMsg, CallerLevel)
    {

    }
}

public bool SecondLevel(string caller, int callerLvl = 3)
{
    return testStacktrace(" called by SecondLevel " + caller, callerLvl);
}
public bool testStacktraceFirstLvl(string caller, int callerLvl = 2)
{
  return new ExcFlsBlV("testStacktrace " + caller, calLvl).Rtrn;
}