2012-12-15 25 views
3

說,我寫了一個類ClassA的。它運作良好,直到有一天我希望監控房地產價值變化並對變化做出反應。最快的方法是什麼?快速監控給定類的屬性值更改的方法?

我可以想到的一種方法:make ClassA繼承INotifyPropertyChanged,並修改屬性getter/setter以觸發PropertyChanged事件,並在事件觸發時執行某些操作。

但是,如果ClassA有10個要監視的屬性,這可能意味着tedius代碼更改。

有沒有更多的elegent方式包裝或修改A類,這樣我就可以掛鉤一些反應邏輯?

幻想:可以通過屬性做到這一點?也許完全是無稽之談,我寫了一個屬性,我只需要將此屬性添加到我希望監視的屬性中。這比添加/修改getters/setters更好。你可能想看看

+2

屬性意味着自己很少;你需要額外的代碼(無論是在編譯時還是在運行時)尋找這個屬性並且實際上做了一些事情(例如,生成一個通知代理,插入IL來引發'PropertyChanged'事件等等)。讓我翻轉但問題是:在什麼情況下,對類別屬性的監控會成爲「驚喜」?你能做一些預先的設計工作,以便你提前知道,並且可以相應地進行編碼嗎? – dlev

+0

看看[這](http://stackoverflow.com/questions/4352537/replace-property-setter-method-at-runtime)線程。 – Mir

+1

邊注:有些人會認爲「具有屬性的10S級」是代碼味道......也許重構類會導致性能的更合理一些,這將是確定,只是手動執行通知。 –

回答

1

東西使用AOP(面向方面​​編程)總之這是什麼讓你做的是把一個包裝器類的方法和屬性,並做出反應前,或調用後。

包裝類中,你將有這樣的事情

Invoke(Args[] Args, Aspect Aspect) 
{ 
    //Do something like monitor something here 
    Aspect.Invoke //execution of method or property 
//Do other stuff here... maybe more monitoring 
} 

關於這個美麗的關注點分離。在您的ClassA中,您的代碼可以繼續專注於之前關注的任何內容,而無需擔心監控代碼。包裝器是處理監控的東西。

參考材料:關於AOP http://en.wikipedia.org/wiki/Aspect-oriented_programming

C#庫

更多信息,您可以使用您的應用程序實現AOP。 城堡項目/動態代理 http://www.castleproject.org/projects/dynamicproxy