我有这堂课:
public class MyClass {
public string GetText() {
return "text";
}
}
我想要的是拥有一个通用的缓存方法。如果调用了GetText,我想拦截这个调用,比如;
public T MethodWasCalled<T>(MethodInfo method) {
if(Cache.Contains(method.Name)) {
return Cache[method.Name] as T;
}
else {
T result = method.Invoke();
Cache.Add(method.Name, result);
return result;
}
}
我希望上面解释我想要完成的事情。对此有什么好的策略?
答案 0 :(得分:2)
PostSharp的边界方面可能就是你所需要的。
一些详细说明:
PostSharp 是一个构建过程库,它在编译时将IL注入到二进制文件中,以公开在常规.NET范围内无法使用的功能。
Boundry Aspect允许您在成员访问之前和之后执行代码。实际上“包装”了这个电话,让你做出奇特的逻辑。
答案 1 :(得分:2)
如果您使用的是.NET 4,请查看Lazy<T>
。
public class MyClass {
private Lazy<string> _text = new Lazy<string>(
() => {
return "text"; // expensive calculation goes here
});
public string GetText() {
return _text.Value;
}
}
lambda中的代码只执行一次。它默认情况下是线程安全的。