Methods C#4拦截方法调用

Methods C#4拦截方法调用,methods,c#-4.0,call,intercept,Methods,C# 4.0,Call,Intercept,我有这门课: public class MyClass { public string GetText() { return "text"; } } 我想要的是有一个通用的缓存方法。如果调用了GetText,我想截取这个调用,比如 public T MethodWasCalled<T>(MethodInfo method) { if(Cache.Contains(method.Name)) { return Cache[

我有这门课:

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;
    }
}
调用公共T方法(MethodInfo方法){ if(Cache.Contains(method.Name)){ 将Cache[method.Name]返回为T; } 否则{ T result=method.Invoke(); Cache.Add(method.Name,result); 返回结果; } } 我希望以上说明了我想要实现的目标。什么是一个好的策略呢?

的边界方面可能正是您所需要的

一些细节:

PostSharp是一个构建过程库,它在编译时将IL注入二进制文件,以公开在常规.NET范围内不可用的功能

Boundry特性允许您在成员访问之前和之后执行代码。实际上,“包装”呼叫,让您可以进行奇特的逻辑。

的边界方面可能正是您所需要的

一些细节:

PostSharp是一个构建过程库,它在编译时将IL注入二进制文件,以公开在常规.NET范围内不可用的功能


Boundry特性允许您在成员访问之前和之后执行代码。实际上是“包装”调用,让您可以执行奇特的逻辑。

如果您使用的是.NET4,请查看

公共类MyClass{
private Lazy _text=new Lazy(
() => {
返回“text”;//此处进行昂贵的计算
});
公共字符串GetText(){
返回_text.Value;
}
}

lambda中的代码将只执行一次。默认情况下它甚至是线程安全的。

如果您使用的是.NET 4,请查看

公共类MyClass{
private Lazy _text=new Lazy(
() => {
返回“text”;//此处进行昂贵的计算
});
公共字符串GetText(){
返回_text.Value;
}
}

lambda中的代码将只执行一次。默认情况下,它甚至是线程安全的。

Doh,我一直在使用它!Doh,我一直在用这个来!
public class MyClass {
    private Lazy<string> _text = new Lazy<string>(
        () => {
            return "text"; // expensive calculation goes here
        });

    public string GetText() {
        return _text.Value;
    }
}