2016-05-03 39 views
1

我有一個實體,我建立了一個實體化的實體和一個修改後的實體。這允許我保存初始數據,以便與修改後的數據進行比較。問題是,什麼纔是理想的方法?我是否應該使用IEquatable作爲覆蓋Object.Equals或實施ICompare?我原來的執行是:比較一個實體

var properties = typeof(TEntity).GetProperties(); 
foreach(var property in properties) 
{ 
    var initialEntity = original.GetType().GetProperty(property.Name).GetValue(original, null);  
    var modifiedEntity = userChange.GetType().GetProperty(property.Name).GetValue(userChange, null); 

    if(initialEntity.Equals(modifiedEntity) == false && !ignore.Contains(property.Name)) 
    { 
     // Do Something 
    } 
} 

我的理解是,它會返回一個boolean,也是在這種情況下,雖然它是基於引用相等比較會比較上值相等,我假設。

因爲它從來沒有區分,它在任何情況下都是平等的。

+0

肯定是不是同一個實例? – George

+0

那些linq實體?如果是,那麼ObjectStateManager已經包含您對它所做的所有更改 – Gusman

+1

您可能想要檢查我幾個月前發佈的某個項目:[TrackerDog](http://matiasfidemraizer.com/trackerdog)。它做到了你想要達到的目標! –

回答

3

最簡單的回答:

  • 如果你需要測試平等,實現IEquatable<T>並覆蓋Equals()GetHashCode()
  • 如果你需要對象進行排序,實現IComparable<T>

默認執行Object.Equals()確定如果一個對象使用的內存位置與另一個對象相同,則返回。這本質上是Object.ReferenceEquals(obj1, obj2)所做的,但是dot net需要你告訴它如何確定你創建的兩個對象是否相等。

此外,Object.GetHashCode()的默認實現是對象在內存中的位置的32位地址(或地址的一部分)。除非你重載它來生成一個哈希代碼,這個哈希代碼是你在Equals()方法中比較的所有東西的函數,否則當你試圖將它存儲在哈希集中或將它用作字典鍵時,你會得到意想不到的結果。

您可能需要同時實施這兩項,但看起來像您的情況IEquatable<T>是最迫切的需求。