2010-08-23 161 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