2013-02-13 57 views
1

我有一個死了INotifyPropertyChanged繼承的簡單視圖模型。試圖爲這個視圖模型創建一些自動化測試後,我最終覆蓋了Equals()GetHashCode()。我的測試通過了,所以我是一個快樂的露營者。爲什麼重寫GetHashCode()塊INotifyPropertyChanged?

但是,現在我的Windows窗體數據綁定沒有反應,當我的視圖模型中的屬性發生更改時。如果我評論我的GetHashCode()實現所有預期的工作,除了我的測試。

這是我實現:

public override int GetHashCode() 
{ 
    unchecked 
    { 
     var hashCode = (_subject != null ? _subject.GetHashCode() : 0); 
     hashCode = (hashCode * 397)^(_message != null ? _message.GetHashCode() : 0); 
     hashCode = (hashCode * 397)^
        (_body != null ? _body.GetHashCode() : 0); 
     return hashCode; 
    } 
} 

這簡直是對我產生什麼ReSharper的。

爲什麼重寫GetHashCode()會阻止我的數據綁定拾取我的視圖模型更改,儘管我調用了PropertyChanged事件?

+0

GetHashCode()和Equals()是否在相同的字段上運行?換句話說,如果Equals()返回true,那麼HashCodes應該是相等的。你能證實情況嗎? – 2013-02-13 18:59:37

+0

我的猜測是被返回的哈希碼每次都是相同的,所以.Net認爲它是相同的對象,並且不會觸發屬性更改的事件。 – 2013-02-13 19:01:06

+1

非常不清楚。什麼數據綁定?用於WinForms的ViewModels?爲什麼測試需要GetHashcode? – 2013-02-13 19:03:49

回答

1

我總是儘量避免將代碼添加到僅用於測試目的的生產代碼中。因此,由於您爲了測試目的而實施了EqualsGetHashCode,是否可以實現IEqualityComparer<T>並在您的單元測試中使用它來執行斷言。

+0

再次感謝。非常好的提示。 – gcso 2013-02-13 19:30:30