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