2016-10-17 51 views
1

我有一個對象被傳遞給一個接口,我希望每個對象的成員改變狀態時都會在該接口的後面執行一些操作。換句話說,我有一些包含整數的對象。當這個整數的值發生變化時,我想讓我的具體類坐在這個接口後面去做一些工作。有沒有辦法在每次對象改變狀態時執行動作?

現在,我可以做一些這樣的事情,通過讓一個線程在wait狀態,並執行一次pulse使用monitor完成一次動作。但是,我想知道C#語言是否有這種內在的支持。這樣,當對象的成員更改狀態時,動作將自動執行。我知道這可能是不可能的,如果有其他解決方案,我希望聽到。或者,這個話題聽起來像個好主意嗎?

+0

如果你想 「執行一些動作」?那是來自消費對象(接收實例的那個對象)嗎?如果是這樣,你能在接口中實現INotifyPropertyChanged並相應地做出響應嗎? – RQDQ

+0

您有兩種模型可以處理這種推拉。在推模式中,對象本身已經建立了對此的支持,通常通過諸如[INotifyPropertyChanged](https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v = vs。 110)的.aspx)。在基於拉式的模型中,您必須持續監視對象並檢測外部的變化。請澄清對象是否支持這些事情,或者是否需要坐在外面。你是通過接口引用傳遞對象還是作爲對類的引用? –

+0

這是一些非常有用的信息,作爲一個相對較新的.NET程序員,我不知道其中的一些東西。而@RQDQ我想在我的具體課程中「執行一些操作」。 – Snoopy

回答

2

您應該實現INotifyPropertyChanged,同時繼承INotifyPropertyChanged之後的接口。然後引入所有狀態相關事物的屬性,並始終在setter方法中引發PropertyChanged事件。

這需要一些樣板代碼,但它是非常可靠的解決方案。您可以使您的屬性變爲虛擬,並使用Unity等IoC容器爲您實現樣板。

執行完成後,您只需使用+ =運算符訂閱對象的PropertyChanged事件。

myWatchedObject.ProperyChanged += listener.DependentObjectChangeHandler; 
+0

爲了解決您的第一個問題,我正在關注的對象已經將其成員實現爲屬性。所以,在'set'裏面引發一個'PropertyChanged'事件應該沒什麼大不了的。 – Snoopy

+0

我想我可以訂閱從我的具體內容(當對象被傳入時),並處理具體內的事件。 – Snoopy

+0

爲了解決樣板問題https://github.com/Fody/PropertyChanged –

2
  1. 使用setter屬性封裝對象的狀態。
  2. 向setter屬性添加更多代碼以引發事件或調用方法。
0

最簡單的方法是性能:

class MyClass 
{ 
    private int _MyInteger; 
    public int MyInteger 
    { 
     get { return _MyInteger; } 
     set { _MyInteger = value; /* insert your "do some work" code here */ } 
    } 
} 
相關問題