在现在的几个项目中,我一直在以相等和可比较的实现形式编写大量样板代码。
Resharper 在这里有很大帮助,因为它可以自动生成代码,您可以在其中选择参与相等性的字段,然后为您吐出样板文件。
我在想,因为这段代码是相当可预测的,但仍然有很多陷阱,它可能会被从类本身中提取出来并移植到一个属性中,在该属性中你将一个属性放在参与的字段之上(可能带有一个订单号为了平等)。
因为“在编码之前思考”:
- 为什么这还不存在(或者我的谷歌技能让我失望了)
- 为什么这是个坏主意?
为什么这已经不存在了
它确实 - 就IComparer<T>
and而言IEqualityComparer<T>
,在我的MiscUtil项目中:
IComparer<Foo> comparer = ProjectionComparer<Foo>.Create(f => f.Name)
.ThenBy(f => f.Age);
和:
IEqualityComparer<Bar> eq = ProjectionEqualityComparer<Bar>.Create(b => b.Name);
或者:
IEqualityComparer<Bar> eq = ProjectionEqualityComparer<Bar>
.Create(b => new { b.Name, b.Age });
我发现越来越多的时候我更喜欢使用这些接口,而不是IEquatable<T>
因为IComparable<T>
这样更灵活,而且通常没有单一的自然方式来排序/比较是否相等。
听起来你在寻找AOP;本质上,聪明的属性。有几个可用于 .NET 的 AOP 框架。这些使您可以将任意逻辑添加到属性中,然后您可以将其放在您想要的任何类上。