覆盖C#中具有许多属性的类的等于

时间:2011-08-30 14:28:06

标签: c# equals

我有许多数据类,它们具有超过25种不同值类型的属性(随着需求的变化,这可能在将来发生变化)。我想覆盖equals,主要用于单元测试目的。

目前,我知道如何做到这一点的唯一方法是实际测试硬编码的每个属性的相等性。这看起来很糟糕有两个原因 - 首先,我将编写大量代码来测试25个属性的相等性 - 第二,如果其中一个类中的属性在稍后的时间点添加,则Equals方法将不会检查那很可能会被忽视并导致问题。

由于Equals通常会检查类的属性,因此应该有一种方法可以动态比较要比较的类的属性,这可以确保对类的属性更改不会导致Equals的错误实现。有没有办法做到这一点?

5 个答案:

答案 0 :(得分:4)

你可以用反射来写这样的东西 - 但这会很慢。 我会坚持用最重要的平等但考虑你真正需要哪一部分是平等的。我通常只检查不可变部分(如Id)是否相等,只是忽略可变字段,我认为这是一个很好的做法。

答案 1 :(得分:1)

尝试使用反射来比较属性。有关详细信息,请参阅Comparing object properties in c#

答案 2 :(得分:1)

如果您的类是实体,它应该具有允许您唯一标识每个实例的属性。

如果您的类被实现为值类型,则必须通过检查每个属性来检查是否相等。 在后一种情况下,为了防止繁琐的工作,您可以使用反射在运行时获取类的所有属性,检索值并使用TypeDescriptor类来比较值。

答案 3 :(得分:1)

您可以使用一些AOP Frameworks。如果您要比较的属性远远超过您要避免的属性,请使用特殊自定义属性标记要跳过的属性。

答案 4 :(得分:1)

也许T4可以帮到你。有了它,您只需点击一下即可生成代码。在此函数中,您可以使用 slow 反射机制来创建将在运行时调用的硬编码 GetHashCode()函数。首先看一下T4,看一下Scotts blog。或者只是尝试使用您最喜欢的搜索引擎搜索Text Template Transformation Toolkit