编辑:警告 - 我现在意识到以下技术通常被认为是一个坏主意,因为它为了看起来整洁而创建了隐藏的依赖项。
我最近发现您可以使用 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/