2016-05-03 2 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), но точка net требует, чтобы вы рассказали ему, как определить, являются ли два создаваемых вами объекта эквивалентными.

Кроме того, реализация по умолчанию Object.GetHashCode() - это 32-разрядный адрес (или часть адреса), в котором объект находится в памяти. Если вы не отмените его, чтобы сгенерировать хеш-код, который является функцией всего, что вы сравнили в своем методе Equals(), вы получите неожиданные результаты при попытке сохранить его в хеш-наборе или использовать его в качестве словарного ключа.

Возможно, вам потребуется реализовать оба варианта, но это похоже на ваш случай. IEquatable<T> - самая насущная необходимость.

Смежные вопросы