2015-10-06 61 views
2

我與角JS工作和整個有趣的功能,可以收看對象的變化來了。關注對象狀態

我不知道是否有在C#中類似的東西。我想創建一些觀察者來接受要觀察的對象,並且可能會定期檢查對象的哈希代碼以查明對象是否改變,然後創建事件。但是這似乎有點低效。

任何想法?

感謝

+0

更常見的方法是將實施IntotifyPropertyChanged接口的類應該被遵守,並實現在屬性設置器上爲你喜歡的屬性引發的事件。 https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged(v=vs.110).aspx –

回答

2

這不會反正工作,首先是因爲有一個屬性變化影響的哈希碼沒有要求,其次,即使它確實影響了哈希碼,這將是可能的新的哈希碼等於舊的哈希碼。

AngularJS做的是跟蹤最近已知的值,然後重新加載所有的值,將它們與先前的值進行比較。如果他們不再平等,就會有變化。

你可以做在C#相同的,如果你想。

但是在C#中更常見的一種方式是讓被監視對象執行INotifyPropertyChanged interface,並在每次更改屬性時提升PropertyChanged事件。這使得對象能夠通知任何感興趣的觀察者屬性已經改變,而不需要觀察者進行任何輪詢。

+0

謝謝。我知道INotifyPropertyChanged,唯一的問題是它只能在實現我自己的類時使用。所以如果我不是該類的所有者,並且沒有財產的替代選項,我不能使用它。即對於觀察者和不訂戶的原因) – jekcom

+1

@jekcom那就沒有其它選擇,只能定期地重新讀取的屬性(或一些其它無特定事件之後)。據我所知,.NET框架沒有辦法做到這一點,但它應該很容易創建。 – hvd

+0

對於良好的散列碼(其用於比較對象)的計算,既您的參數不應該保持(改變屬性應該改變散列,並且通常,散列應在1 ^64箱子或多個具有低的任何2個不同的對象必須足夠不同碰撞的可能性)。主要原因應該是投票不是一個好選擇。此外,就像你說的那樣,PropertyChanged是一個選項,儘管它不是免費的實現方式。 –

2

在JavaScript和C#中,對象都不是可觀察本身

實際上,Angular將對象轉化爲引擎蓋下的可觀察對象,並且由於JavaScript是一種動態類型語言,因此這種轉換或包裝可以輕鬆完成。

因爲C#是一種強類型語言,所以如果它們沒有實現一個接口或者某個事件可以暴露一個事件來訂閱更改,那麼您將無法觀察它們。通常可觀察對象應該實現INotifyPropertyChanged接口。

實現此目的的其他方式是使用像Castle DynamicProxy這樣的框架來創建類的代理並攔截方法調用和屬性獲取和設置。