为c#中具有许多属性的类重写等号
本文关键字:重写 属性 许多 | 更新日期: 2023-09-27 18:06:57
我有许多数据类,它们有超过25个不同值类型的属性(这可能在将来随着需求的变化而改变)。我想重写等号,主要是为了单元测试的目的。
目前,我知道如何做到这一点的唯一方法是实际测试每个硬编码属性的相等性。这看起来很糟糕,有两个原因——首先,我将不得不编写大量代码来测试25个属性是否相等——其次,如果一个类中的一个属性是在稍后的时间点添加的,Equals方法将不会检查它,并且很可能这将被忽视并导致后续的问题。
由于Equals通常检查类的属性,因此应该有一种方法来动态比较被比较的类的属性,以确保对类的属性更改不会导致Equals的错误实现。有办法做到这一点吗?
您可以使用反射来编写类似的内容-但这将非常慢。我会坚持重写等号,但考虑一下你真正需要的是等号的哪一部分。我通常只检查不可变部分(如Id)的平等,只是忽略可变字段,我认为这是一个很好的做法。
尝试使用反射来比较属性。有关更多信息,请参阅比较c#中的对象属性!
如果你的类是一个实体,它应该有一个属性,允许你唯一地标识每个实例。
如果你的类是作为值类型实现的,你必须通过检查每个属性来检查是否相等。对于后一种情况,为了避免繁琐的工作,您可以使用反射在运行时获取类的所有属性,检索值并使用TypeDescriptor类来比较这些值。
您可以使用一些AOP框架。如果你要比较的属性比那些你要避免的要多得多,用特殊的自定义属性标记要跳过的属性。
也许T4可以帮助你。有了它,你可以一次点击生成代码。在这个函数中,你可以使用slow反射机制来创建一个将在运行时调用的硬编码 GetHashCode()函数。想要第一次了解T4,可以看看斯科特的博客。或者干脆用你喜欢的搜索引擎搜索Text Template Transformation Toolkit
。