2012-08-15 14 views
3

我有一個實現INotifyPropertyChanged都有自己的屬性的概念,有點像這樣一類:如果我在我的課程中沒有具有該名稱的相應屬性,我應該提出INotifyPropertyChanged事件嗎?

class sealed MyClass : INotifyPropertyChanged 
{ 
    private Dictionary<string, object> _properties; 

    public object GetProperty(string name) 
    { 
     return _properties[name]; 
    } 

    public object SomeProperty 
    { 
     get 
     { 
      return GetProperty("SomeProperty"); 
     } 
    } 
} 

注意一些常見的性質也有C#存取。

我想引發一個事件來通知其他人,即使該屬性沒有相應的C#訪問器,屬性(通過GetProperty方法訪問其值)也發生了變化。

假設沒有發生衝突的風險(即,無意提高C#屬性的屬性更改事件的值,該值未發生變化 - 請注意,此類是密封的),我有什麼理由不能僅僅使用INotifyPropertyChanged.PropertyChanged事件來通知其他人,還是應該爲此添加自己的事件?

回答

2

我建議你添加自己的。儘管沒有特定的原因會導致代碼崩潰,但是INotifyPropertyChanged具有特定的預期用途,並且很多潛在消費者都能理解。我不會親自編寫與之相抵觸的代碼,以防萬一。

+0

我打算提出相反的觀點,但已經考慮過了,我想我贊同丹。如果你的類實現了普通屬性和動態屬性,我認爲至少一個單獨的事件會告訴消費者在哪裏找到那個屬性。 – GazTheDestroyer 2012-08-15 14:12:23

0

據我所知,提升PropertyChanged對於不存在的財產沒有任何壞處,但我認爲它也不是很有用。 INotifyPropertyChanged主要用於數據綁定系統(WinForms,WPF,Silverlight ...),而這些系統不知道如何訪問自定義的「屬性」。

現在,您可以執行的操作是使用ICustomTypeDescriptor以標準方式訪問您的自定義屬性。這適用於Windows窗體和WPF,我不確定其他框架。

當然,如果你的意圖是不使用這個數據綁定,你仍然可以使用這個事件來通知你的類的消費者數值已經改變。

0

從技術上講,這取決於誰已經訂閱了PropertyChanged什麼他們對PropertyChanged事件做出響應。如果他們不嘗試讀取.NET「屬性」,那就沒問題。

但是,這確實引入了一個耦合,並且INPC的使用試圖去耦合。 INPC在一般情況下假定PropertyChanged意味着.NET屬性(給定名稱)已更改,並且預計將適用於所有使用INPC的地方。即您實施INPC,因爲您要在接受INPC的地方使用任何地方的對象。如果你的對象無法做到這一點,那麼它違反了INPC隱含的合同。如果你有一個PropertyChanged處理程序,它執行的操作與讀取屬性不同,並且因爲它在那裏而重新使用INPC,那麼編寫自己的接口是個好主意。

相關問題