2016-05-03 8 views
1

私はエンティティを作成しました。インスタンス化されたエンティティと変更されたエンティティを取得します。これにより、初期データを保持し、変更されたデータと比較することができます。質問は、理想的なアプローチは何でしょうか? Object.EqualsにオーバーライドとしてIEquatableを実装するか、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

最も簡単な答え:あなたは平等をテストする必要がある場合は

  • 、あなたがオブジェクトをソートする必要がある場合は、IComparable<T>

を実装IEquatable<T>を実装し、Equals()GetHashCode()

  • を上書きObject.Equals()ディテールのデフォルトの実装1つのオブジェクトによって使用されるメモリの場所が別のオブジェクトと同じ場合に使用されます。これは本質的にObject.ReferenceEquals(obj1, obj2)のことですが、ドットネットでは、作成する2つのオブジェクトが同等かどうかを判断する方法を教えてください。 のデフォルト実装は、オブジェクトがメモリ内にある32ビットアドレス(またはアドレスの一部)です。 Equals()メソッドで比較したすべての関数であるハッシュコードを生成するためにオーバーライドしないかぎり、ハッシュセットに格納するか、辞書キーとして使用すると予期しない結果が発生します。

    両方を実装する必要があるかもしれませんが、あなたのケースではIEquatable<T>のように見えます。

  • 関連する問題