2014-09-25 48 views
0

好吧,我正在閱讀關於如何覆蓋object.Equals和==值和參考類型的所有建議。總之,總是覆蓋結構的相等性,並且不會覆蓋引用類型的相等性,除非您有類似包裝單個字符串的異常情況。 (但是,除非它很小,否則不要構造結構,即使語義上或DDD術語它是一個值類型)接口的等價值不會改變箱外行爲?

但是我的大多數保存數據的類型都是DTOS--具有許多屬性的類。他們有更多的適合於結構的屬性(超過16字節),並且會被期望==和object.Equals像往常一樣運行的開發人員使用。所有這三種情況都出現了 - 需要通過引用,值(特別是在單元測試中)和密鑰(尤其是在處理來自關係數據庫或正在關聯數據庫中的數據時)來檢查平等。

是否存在.NET框架的方式來實現按等值或等於按鍵而不跺腳object.Equals的默認行爲?或者我必須創建我自己的專用接口,如ISameByValue<T>ISameByKey<T>

+2

也許你需要的IEqualityComparer? http://msdn.microsoft.com/en-us/library/ms132151%28v=vs.110%29.aspx – 2014-09-25 13:52:16

+1

你可以公開你自己的比較器,這樣你的圖書館客戶端就可以在閒暇時使用它。不要猶豫,放下腳步,班級越大,客戶端代碼創建重複對象的可能性就越小。無法訪問比較器可能會讓他做正確的事情。 – 2014-09-25 14:21:41

回答

2

創建IEqualityComparer類型。這允許您創建任意數量的不同類型,能夠通過任意多個不同的相等定義來比較您的對象,而不會改變類型本身的任何行爲。

1

我遇到了一個問題,我在重寫的Equals方法(實現HasChanges類型功能)中實現了基於屬性的比較,但是當我更新集合中的項目的屬性值時,它引發了各種各樣的問題。

我的解決方案(由本網站的有用用戶發現)是將基於屬性的比較轉換爲新的自定義方法,並返回默認的object.Equals值。但是,這意味着調用Equals方法時不再有任何基於比較的比較。

然後將溶液提供IEqualityComparer<T> Interface的定製實現,並通過給需要的對象比較的任何方法通過實例,如IEnumerable IntersectExcept方法,例如:

if (digitalServiceProvider.PriceTiers[index].Territories.Count > 0 && 
    digitalServiceProvider.PriceTiers[index].Territories.Intersect(
    release.TerritorialRights, new CountryEqualityComparer()).Count() == 0) { ... }