C# 在C中重写具有许多属性的类的等于#

C# 在C中重写具有许多属性的类的等于#,c#,equals,C#,Equals,我有许多数据类,它们有超过25个不同值类型的属性(这在将来可能会随着需求的变化而变化)。我想重写equals,主要是为了单元测试的目的 目前,我知道的唯一方法是实际测试硬编码的每个属性的相等性。这看起来很糟糕,有两个原因-首先,我必须编写大量代码来测试25个属性的相等性-其次,如果其中一个类中的属性在稍后添加,Equals方法将不会检查这一点,很可能这会被忽略并导致问题 由于Equals通常检查类的属性,因此应该有一种方法来动态比较被比较的类的属性,从而确保对类的属性更改不会导致Equals的错

我有许多数据类,它们有超过25个不同值类型的属性(这在将来可能会随着需求的变化而变化)。我想重写equals,主要是为了单元测试的目的

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


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

尝试使用反射来比较属性。有关更多信息,请参阅

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

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

您可以使用反射编写类似的内容,但这会非常慢。
我会坚持压倒平等,但想想你真正需要平等的那一部分。我通常只检查不可变部分(如Id)是否相等,而忽略可变字段,我认为这是一个很好的做法。

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

也许T4可以帮你。有了它,您只需单击一下就可以生成代码。在这个函数中,您可以使用慢速反射机制创建一个硬编码的GetHashCode()函数,该函数将在运行时调用。第一次看T4,请看一下它。或者简单地用您喜爱的搜索引擎搜索
文本模板转换工具包