【问题标题】:IEquals and IComparable by attributeIEquals 和 IComparable 按属性
【发布时间】:2013-01-21 11:47:03
【问题描述】:

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

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

因为“三思而后行”:

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

【问题讨论】:

    标签: .net compare equals


    【解决方案1】:

    为什么这还不存在

    确实如此——就IComparer<T>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&lt;T&gt;IComparable&lt;T&gt;,因为这样更灵活,而且通常没有单一自然的方式排序/比较是否相等。

    【讨论】:

    • 看起来很有希望。会看看
    • 我还怀疑您在 IEquality 标签上安装了监视器。每次我用那个标签问问题时,你就像一只饥饿的狗一样;)
    • 有没有想过把它扔到 github 上或其他什么地方?
    • @BorisCallens:是的,但基本上我还没找到时间。我已经很长时间没有对其进行任何积极的开发了......
    【解决方案2】:

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

    【讨论】:

    • 很高兴看到我不是第一个有这种感觉的人。这为我正在寻找的东西命名。现在有一大堆谷歌线程。谢谢:)
    • 在研究了这些框架之后,它们可能就是我想要的,但也正在用锤子打苍蝇
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多