我有一个接受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;
}
将调用者方法作为数据传递的正确方法是什么?
答案 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;
}