2011-08-30 38 views
5

我有許多數據類有超過25個不同值類型的屬性(並且隨着需求的變化,這可能會改變)。我想重寫equals,主要是爲了單元測試目的。C#中有很多屬性的類的覆蓋等於

目前,我知道如何做到這一點的唯一方法是實際測試硬編碼的每個屬性的相等性。這看起來很糟糕,原因有二:首先,我必須編寫大量代碼來測試25個屬性是否相等 - 其次,如果其中一個類中的屬性稍後添加,Equals方法將不會檢查這很可能會被忽視,並導致問題在後面。

由於Equals通常會檢查類的屬性,因此應該有一種方法來動態比較要比較的類的屬性,從而確保對類的屬性更改不會導致Equals的錯誤實現。有沒有辦法做到這一點?

回答

4

你可以使用反射寫這樣的東西 - 但這會很慢。 我會堅持重寫平等,但想想你真的需要平等的部分。我通常只檢查不可變的部分(如Id)是否平等,並忽略可變字段,我認爲這是一個很好的做法。

1

如果你的類是一個實體,它應該有一個屬性,它允許你唯一標識每個實例。

如果您的類是作爲值類型實現的,則必須通過檢查每個屬性來檢查相等性。 在後一種情況下,爲了防止繁瑣的工作,您可以利用反射在運行時獲取該類的所有屬性,檢索該值並使用TypeDescriptor類來比較這些值。

1

您可以使用一些AOP Frameworks。如果你想要比較的屬性遠多於那些你想要避免的屬性,那麼將屬性標記爲跳過特殊的自定義屬性。

1

也許T4可以幫助你。有了它,你可以點擊生成代碼。在此功能中,您可以使用反射機制創建一個硬編碼的 GetHashCode()函數,該函數將在運行時調用。首先看看T4看看Scotts blog。或者只需嘗試使用您最喜歡的搜索引擎搜索Text Template Transformation Toolkit