【问题标题】:Overriding Equals for classes with many properties in C#在 C# 中为具有许多属性的类覆盖 Equals
【发布时间】:2011-11-06 20:54:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# equals


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      尝试使用反射来比较属性。请参阅Comparing object properties in c# 了解更多信息!

      【讨论】:

        【解决方案3】:

        如果你的类是一个实体,它应该有一个属性可以让你唯一标识每个实例。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            也许 T4 可以帮助您。有了它,您可以一键生成代码。在这个函数中,您可以使用 slow 反射机制来创建将在运行时调用的 硬编码 GetHashCode() 函数。要初步了解 T4,请查看Scotts blog。或者干脆尝试使用您最喜欢的搜索引擎搜索Text Template Transformation Toolkit

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-04-03
              • 1970-01-01
              • 1970-01-01
              • 2013-07-05
              相关资源
              最近更新 更多