2016-05-03 43 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>是最迫切的需求。