相关疑难解决方法(0)

如何找到调用当前方法的方法?

登录C#时,如何学习调用当前方法的方法的名称?我知道所有这些System.Reflection.MethodBase.GetCurrentMethod(),但我想在堆栈跟踪中向下迈出一步.我考虑过解析堆栈跟踪,但我希望找到一种更清晰,更明确的方法,比如Assembly.GetCallingAssembly()方法.

.net c# logging system.diagnostics stack-trace

465
推荐指数
11
解决办法
21万
查看次数

调用堆栈没有说"你来自哪里",而是"你下一步去哪里"?

在上一个问题(获取对象调用层次结构)中,我得到了这个有趣的答案:

调用堆栈不是告诉你你来自哪里.它是告诉你下一步的去向.

据我所知,当到达函数调用时,程序通常会执行以下操作:

  1. 调用代码时:

    • 存储返回地址(在调用堆栈上)
    • 保存寄存器的状态(在调用堆栈上)
    • 写入将传递给函数的参数(在调用堆栈或寄存器中)
    • 跳转到目标函数

  2. 被叫目标代码中:

    • 检索存储的变量(如果需要)

  3. 返回过程:撤消我们调用函数时所做的操作,即展开/弹出调用堆栈:

    • 从调用堆栈中删除局部变量
    • 从调用堆栈中删除函数变量
    • 恢复寄存器状态(我们之前存储的状态)
    • 跳转到返回地址(我们之前存储的地址)

题:

如何将其视为"告诉您下一步的去向"而不是"告诉您从何而来"

在C#的JIT或C#的运行时环境中是否存在使得调用堆栈以不同方式工作的东西?

感谢有关调用堆栈描述的文档的任何指示 - 有大量关于传统调用堆栈如何工作的文档.

.net c# callstack

15
推荐指数
2
解决办法
2045
查看次数

在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的答案则提出了我之前未曾考虑过的解决方案.

c# types

14
推荐指数
2
解决办法
2万
查看次数

标签 统计

c# ×3

.net ×2

callstack ×1

logging ×1

stack-trace ×1

system.diagnostics ×1

types ×1