gpt4 book ai didi

.net - 有没有更好的方法来为具有很多字段的对象实现 Equals?

转载 作者:行者123 更新时间:2023-12-05 03:16:02 25 4
gpt4 key购买 nike

see also Hows to quick check if data transfer two objects have equal properties in C#?

我有很多数据传输对象 (DTO),每个对象都包含很多简单字段。我需要对它们全部实现 Equals(这样我就可以编写一些单元测试来传输它们 var WCF)。

我使用的代码是:

public override bool Equals(object rhs)
{

RequestArguments other = rhs as RequestArguments;

return
other != null &&
other.m_RequestId.Equals(RequestId) &&
other.m_Type.Equals(m_Type) &&
other.m_Parameters.Equals(m_Parameters) &&
other.m_user.Equals(m_user);
}

必须有更好的方法!... (列出所有字段是在寻找错误和维护问题)

例如我们有对象。 MemberwiseClone() 来帮助处理 Cloning() 案例,但我找不到任何可以帮助处理 Equals 的东西。我们在完全信任的情况下运行,因此基于反射的解决方案是一个答案,但我不想重新发明轮子。

(抱歉,我们不从特定领域的语言生成 DTO,否则这种事情会很容易!而且我无法更改构建系统以添加另一个步骤)

最佳答案

有趣的是你应该问,我最近发布了一些代码来做这件事。查看我的 MemberwiseEqualityComparer看看它是否符合您的需求。

它真的很容易使用,而且效率很高。它使用 IL-emit 在第一次运行时生成整个 Equals 和 GetHashCode 函数(每种使用的类型一次)。它将使用该类型的默认相等比较器 (EqualityComparer.Default) 比较给定对象的每个字段(私有(private)或公共(public))。我们已经在生产中使用它一段时间了,它看起来很稳定,但我不做任何保证 =)

它会处理所有那些你在滚动自己的 equals 方法时很少想到的讨厌的边缘情况(即,你不能将你自己的对象与 null 进行比较,除非你先将它装箱在一个对象中还有很多与 null 相关的问题)。

我一直想写一篇关于它的博文,但还没有抽出时间来。该代码有点未记录,但如果您喜欢它,我可以稍微清理一下。

public override int GetHashCode()
{
return MemberwiseEqualityComparer<Foo>.Default.GetHashCode(this);
}

public override bool Equals(object obj)
{
if (obj == null)
return false;

return Equals(obj as Foo);
}

public override bool Equals(Foo other)
{
return MemberwiseEqualityComparer<Foo>.Default.Equals(this, other);
}

MemberwiseEqualityComparer 在 MIT license 下发布这意味着您几乎可以用它做任何您想做的事情,包括在专有解决方案中使用它而无需稍微更改您的许可。

关于.net - 有没有更好的方法来为具有很多字段的对象实现 Equals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1831747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com