2014-09-25 46 views
0

好吧,我正在阅读关于如何覆盖object.Equals和==值和参考类型的所有建议。总之,总是覆盖结构的相等性,并且不会覆盖引用类型的相等性,除非您有类似包装单个字符串的异常情况。 (但是,除非它很小,否则不要构造结构,即使语义上或DDD术语它是一个值类型)接口的等价值不会改变箱外行为?

但是我的大多数保存数据的类型都是DTOS--具有许多属性的类。他们有更多的适合于结构的属性(超过16字节),并且会被期望==和object.Equals像往常一样运行的开发人员使用。所有这三种情况都出现了 - 需要通过引用,值(特别是在单元测试中)和密钥(尤其是在处理来自关系数据库或正在关联数据库中的数据时)来检查平等。

是否存在.NET框架的方式来实现按等值或等于按键而不跺脚object.Equals的默认行为?或者我必须创建我自己的专用接口,如ISameByValue<T>ISameByKey<T>

+2

也许你需要的IEqualityComparer? http://msdn.microsoft.com/en-us/library/ms132151%28v=vs.110%29.aspx – 2014-09-25 13:52:16

+1

你可以公开你自己的比较器,这样你的图书馆客户端就可以在闲暇时使用它。不要犹豫,放下脚步,班级越大,客户端代码创建重复对象的可能性就越小。无法访问比较器可能会让他做正确的事情。 – 2014-09-25 14:21:41

回答

2

创建IEqualityComparer类型。这允许您创建任意数量的不同类型,能够通过任意多个不同的相等定义来比较您的对象,而不会改变类型本身的任何行为。

1

我遇到了一个问题,我在重写的Equals方法(实现HasChanges类型功能)中实现了基于属性的比较,但是当我更新集合中的项目的属性值时,它引发了各种各样的问题。

我的解决方案(由本网站的有用用户发现)是将基于属性的比较转换为新的自定义方法,并返回默认的object.Equals值。但是,这意味着调用Equals方法时不再有任何基于比较的比较。

然后将溶液提供IEqualityComparer<T> Interface的定制实现,并通过给需要的对象比较的任何方法通过实例,如IEnumerable IntersectExcept方法,例如:

if (digitalServiceProvider.PriceTiers[index].Territories.Count > 0 && 
    digitalServiceProvider.PriceTiers[index].Territories.Intersect(
    release.TerritorialRights, new CountryEqualityComparer()).Count() == 0) { ... }