2011-02-02 5 views
7

クラスの等価メンバを生成することはできますか?そのクラスには基本クラスのメンバも含まれますか?例えばResharper - 基底クラスメンバを含む平等メンバの生成

- 抽象基底クラス:

public abstract class MyBaseClass 
{ 
    public int Property1; 
} 

その他のクラス:

public class MyOtherClass: MyBaseClass 
{ 
    public int Property2 {get; set;} 
} 

私はReSharperのと等しいメンバーを自動生成した場合、私はからProperty1上だけMyOtherClass.Property2プロパティに基づいて平等を取得していませんその基底クラス。

答えて

10

まず、ベースクラスで等価チェックを生成し、それを子孫で行います。

子孫では、違いはpublic bool Equals(MyOtherClass other)クラスになります。基本クラスの平等のチェックなしで

:基本クラスの平等-チェックを

public bool Equals(MyOtherClass other) 
{ 
    if (ReferenceEquals(null, other)) 
     return false; 
    if (ReferenceEquals(this, other)) 
     return true; 
    return other.Property2 == Property2; 
} 

public bool Equals(MyOtherClass other) 
{ 
    if (ReferenceEquals(null, other)) 
     return false; 
    if (ReferenceEquals(this, other)) 
     return true; 
    return base.Equals(other) && other.Property2 == Property2; 
} 

お知らせためのプロパティの責任となりbase.Equals(other)に追加の呼び出し、基本クラス

あなたは他の方法で回避にそれを行う場合は、あなたが最初の子孫に平等のチェックを追加し、基本クラスに追加していること、そして、ReSharperのは行かないと遡って子孫にコードを修正し、それを再生成(delete + generate)するか、手動でコードを修正する必要があります。

+3

を再生成するには、削除する必要はありません。生成すると、既存のメンバーを置き換えるオプションがあります。 –

+0

Aha!その情報をありがとう。 –

+0

Infact、これは今日Resharper(Equalsメソッドの保護されたバージョン)で生成されたもので、 – Ergodyne

関連する問題