c# - 使用 StackTrace 推断方法的调用者

标签 c# stack-trace

编辑:警告 - 我现在意识到以下技术通常被认为是一个坏主意,因为它为了看起来整洁而创建了隐藏的依赖项。


我最近发现您可以使用 StackTrace 来推断有关方法调用者的信息。

这使您能够创建一个看似“酷”的 API,您只需调用一个方法,而无需费心向它传递任何显式参数,该方法会根据 StackTrace 确定要执行的操作。

这是一件坏事吗?如果是,为什么?

例子:

public class Cache {
  public Object CheckCache()
  {
    Object valueToReturn = null;
    string key = GenerateCacheKeyFromMethodPrototype(new StackTrace().GetFrame(1).GetMethod()); //frame 1 contains caller
    if(key is in cache) valueToReturn = itemFromCache;

    return valueToReturn;   
  }
}

public class Foo { 
  private static Cache cache = new Cache();

  public Blah MethodFoo(param1, param2...)
  {
    Blah valueToReturn = cache.CheckCache(); //seems cool!
    if(valueToReturn == null)
    {
      valueToReturn = result of some calculation;
      //populate cache
    }

    return valueToReturn;
  }
}

我确定上面的伪代码中有错误,但你明白我的意思。


编辑:感谢大家的回复。

最佳答案

不这样做的原因有两个:

  • 它很慢
  • 它创建了一个脆弱的解决方案。

如果你想这样做,你最好使用支持面向方面编程的工具,例如 CaSTLe 的动态代理。

关于c# - 使用 StackTrace 推断方法的调用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/318347/

相关文章:

c# - 字典与哈希表的内存使用情况

c - 如何充分利用堆栈跟踪(来自内核或核心转储)?

c - Valgrind(低于主要),如何获得完整的堆栈跟踪?

javascript - 如何生成 javascript 堆栈跟踪?

c++ - 共享库中的回溯函数

c++ - 不可能的堆栈跟踪?尽管已检查,但使用this = nullptr的访问冲突

c# - 一维快速傅立叶变换

javascript - C# 如何在静态Web方法中获取asp.net文本框值?

c# - .net 2.0 Web 服务是否始终使用 Soap over http?

c# - 在 visual studio 2015 社区上安装 Xamarin.Auth 时出错