登录C#时,如何学习调用当前方法的方法的名称?我知道所有这些System.Reflection.MethodBase.GetCurrentMethod(),但我想在堆栈跟踪中向下迈出一步.我考虑过解析堆栈跟踪,但我希望找到一种更清晰,更明确的方法,比如Assembly.GetCallingAssembly()方法.
在上一个问题(获取对象调用层次结构)中,我得到了这个有趣的答案:
调用堆栈不是告诉你你来自哪里.它是告诉你下一步的去向.
据我所知,当到达函数调用时,程序通常会执行以下操作:
在调用代码时:
在被叫目标代码中:
返回过程:撤消我们调用函数时所做的操作,即展开/弹出调用堆栈:
题:
如何将其视为"告诉您下一步的去向"而不是"告诉您从何而来"?
在C#的JIT或C#的运行时环境中是否存在使得调用堆栈以不同方式工作的东西?
感谢有关调用堆栈描述的文档的任何指示 - 有大量关于传统调用堆栈如何工作的文档.
无论这是否是一个好主意,是否可以实现一个接口,其中执行函数知道调用对象的类型?
class A
{
private C;
public int doC(int input)
{
return C.DoSomething(input);
}
}
class B
{
private C;
public int doC(int input)
{
return C.DoSomething(input);
}
}
class C
{
public int DoSomething(int input)
{
if(GetType(CallingObject) == A)
{
return input + 1;
}
else if(GetType(CallingObject) == B)
{
return input + 2;
}
else
{
return input + 3;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这是一个糟糕的编码实践(因为参数不会改变,但输出会)但除此之外是否可能?
我在某种情况下,我想要一些特定的类型能够调用某个函数,但我无法排除对该函数的访问.我想过有一个"类型"参数
DoSomething(int input, Type callingobject)
Run Code Online (Sandbox Code Playgroud)
但是不能保证调用对象会使用GetType(this),而不是GetType(B)来欺骗B而不管它们自己的类型.
这会像检查callstack一样简单(相对简单)吗?
编辑
请把JaredPar的答案(如果你想的话)和John Feminella的答案一起投票.我无法将这两个答案都标记为已被接受,我接受了John Feminella的答案,因为它特别符合我的要求,而Jared的答案则提出了我之前未曾考虑过的解决方案.