0

在现在的几个项目中,我一直在以相等和可比较的实现形式编写大量样板代码。
Resharper 在这里有很大帮助,因为它可以自动生成代码,您可以在其中选择参与相等性的字段,然后为您吐出样板文件。

我在想,因为这段代码是相当可预测的,但仍然有很多陷阱,它可能会被从类本身中提取出来并移植到一个属性中,在该属性中你将一个属性放在参与的字段之上(可能带有一个订单号为了平等)。

因为“在编码之前思考”:

  • 为什么这还不存在(或者我的谷歌技能让我失望了)
  • 为什么这是个坏主意?
4

2 回答 2

2

为什么这已经不存在了

它确实 - 就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>这样更灵活,而且通常没有单一的自然方式来排序/比较是否相等。

于 2013-02-06T10:13:31.043 回答
2

听起来你在寻找AOP;本质上,聪明的属性。有几个可用于 .NET 的 AOP 框架。这些使您可以将任意逻辑添加到属性中,然后您可以将其放在您想要的任何类上。

于 2013-02-06T10:14:11.363 回答