2010-08-23 110 views
0

我有这个类:C#4拦截方法调用

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; 
    } 
} 

我希望上面的解释我想完成。这将是一个很好的策略?

回答

2

PostSharp的边界方面可能是你所需要的。

一些阐述:

PostSharp是IL注入到你的二进制文件在编译时将功能定期.NET的范围内不availiable构建过程库。

Boundry Aspect允许您在成员访问之前和之后执行代码。实际上“包装”了这个呼叫,让你做了一些奇怪的逻辑。

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中的代码只会执行一次。甚至默认情况下它是线程安全的。

+0

Doh,我一直用这个! – ChaosPandion 2010-08-24 21:05:22