2011-08-30 11 views
5

私は25種類以上の異なる値のプロパティを持つデータクラスをいくつか持っています(これは将来変更される可能性があります)。主に単体テストの目的でequalsをオーバーライドしたいと思います。C#で多くのプロパティを持つクラスのEqualsをオーバーライド

現在のところ、これを行う方法を知っている唯一の方法は、ハードコードされた各プロパティの等価性を実際にテストすることです。これは2つの理由から悪いようです。まず、クラスのプロパティが後で追加された場合、Equalsメソッドでチェックされないクラスを25個テストするコードを書く必要があります。そして、これは気づかずに通り過ぎて、問題の原因になるでしょう。

通常、Equalsはクラスのプロパティをチェックするので、比較するクラスのプロパティを動的に比較する必要があります。これにより、クラスに対するプロパティの変更によってEqualsの誤った実装が発生することはありません。これを行う方法はありますか?

答えて

4

反射を使用してこのようなものを書くことができますが、これは非常に遅いでしょう。 私はequalsをオーバーライドすることに固執しますが、あなたが本当に平等に必要な部分を考えます。私は通常、Idのような不変部分をチェックして、等価であるかどうかだけをチェックし、変更可能なフィールドは無視して、これは良い方法だと思います。

1

クラスがエンティティの場合は、各インスタンスを一意に識別できるプロパティが必要です。

クラスが値型として実装されている場合は、各プロパティをチェックして等価性をチェックする必要があります。 退屈な作業を防ぐために、リフレクションを使用して実行時にクラスのすべてのプロパティを取得し、値を取得してTypeDescriptorクラスを使用して値を比較できます。

1

AOP Frameworksを使用できます。あなたが比較しようとしているプロパティが、あなたが避けようとしているものよりはるかに多い場合は、プロパティを特別なカスタム属性でスキップするようにマークします。

1

多分、T4があなたを助けることができます。これにより、クリックしてコードを生成することができます。この関数内で遅い反射メカニズムを使用して、実行時に呼び出される GetHashCode()関数をハードコーディングしたを作成することができます。 T4の最初の見方については、それについてScotts blogを見てください。または、お気に入りの検索エンジンでText Template Transformation Toolkitを検索してみてください。

関連する問題