2011-01-19 142 views
0

考慮以下對象:髒檢查對象?

Public Class Foo 
    dim m_SomePropertyInFoo as string 

    public property SomePropertyInFoo as string 
    get 
     return m_SomePropertyInFoo 
    end get 
    set(value as string) 
     m_SomePropertyInFoo = value 
    end set 
end Class 

我想確定何時SomePropertyInFoo有哪些有資格的Foo實例爲髒的新值。這裏有一個問題:我不想在每個setter中調用一些函數,因爲我不希望開發人員每次都必須實現代碼(因爲他們可能會犯錯並錯過一個屬性)。

回答

0

這裏是漁獲:我不希望有調用一些功能在每個二傳手,因爲我不想讓開發者有實現代碼每次(因爲他們犯了一個錯誤和遺漏屬性)。

我可以看到兩個選項。

如果您的類型實現了INotifyPropertyChanged,您可以訂閱該對象的PropertyChanged事件並使用它來跟蹤更改。

否則,如果您想要實施此而不更改屬性的代碼,則需要進行外部更改跟蹤。您可以創建一個使用Reflection(或潛在的PropertyDescriptors)來獲取每個屬性值的方法,稍後將其與當前值進行比較以確定該對象是否「髒」。然而,這不是一個便宜的操作。

另一個可能更優雅的選項是使用Aspect Oriented Programming在編譯時自動將代碼添加到每個屬性。例如,PostSharp可以很容易地處理這個問題。

+0

我們想出了第二你的建議作爲一個選項。我們正在進行的辯論是不得不重複記憶。但很高興知道我們一直在思考這些問題。 – Achilles 2011-01-19 17:36:28

+1

@Achilles:它很醜 - 但它很有效。如果你想避免把代碼放在屬性中,你幾乎要複製內存...... – 2011-01-19 17:38:50

0

最初將m_SomePropertyInFoo設置爲null(在VB中爲Nothing)。然後,當你想檢查一個值是否已經設置時,檢查它是否爲空。

如果值爲null,則必須調整setter以返回String.Empty,否則必須在下一層處理NullReference異常,這並不好玩。我的VB有點生疏,但這裏有:

dim m_SomePropertyInFoo as string = Nothing 

public property SomePropertyInFoo as string 
    get 
     If m_SomePropertyInFoo Is Nothing Then 
      return string.Empty 
     Else 
      return m_SomePropertyInFoo 
     End If 
    end get 
    set(value as string) 
     m_SomePropertyInFoo = value 
    end set 
+0

說這個屬性是一個整數。假設原始值爲4.代碼將該值更改爲0.在VB中,*整數的任何值也都是0 *。是髒還是不髒? – 2011-01-19 17:36:07

1

幾個選項,如果你不想重新編碼每個屬性。

  1. 考慮使用一個框架,它可以自動將代碼編入你的類中,以實現變更跟蹤,例如, PostSharp

  2. 當您第一次檢索實例時序列化實例,在保存它的位置對其進行序列化並對字節進行比較。

1是優選的,而2可能是便宜和討厭的。