比较某些道具具有不同格式的对象

Posted

技术标签:

【中文标题】比较某些道具具有不同格式的对象【英文标题】:Compare objects where some props have different formats 【发布时间】:2012-02-23 05:25:44 【问题描述】:

比较两个对象的所有属性的最佳方法是什么,其中一些对象具有不同的格式(例如,DateTime 在一个中,DateTime.ToString() 在另一个中具有自定义格式)?

我可以通过使用 2 个断言来做到这一点:

o1.ShouldHave().AllPropertiesBut(dto1 => dto1.Date).EqualTo(o2);
o1.Date.Should().Be(DateTime.Parse(o2.Date));

我会考虑以下内容,但这无法编译,因为 EqualTo<T>() 是无效的。

o1.ShouldHave().AllProperties().But(d => d.Date).EqualTo(o2)
.And.Date.Should().Be((DateTime.Parse(o2.Date));

类型是:

public class Dto1

    public int ID  get  return 1;  
    public DateTime Date  get  return DateTime.Now.Date;  


public class Dto2

    public int ID  get  return 1;  
    public string Date  get  return DateTime.Now.Date.ToShortDateString();  


var o1 = new Dto1();
var o2 = new Dto2();

【问题讨论】:

【参考方案1】:

第一个示例通常是最好的方法。但是,如果您要切换 o1 和 o2,它可能会在一次调用中起作用。 Fluent Assertions 将尝试(使用 Convert.ChangeType)将属性的实际值转换为具有相同名称的属性的预期值。在您的特定示例中,它会在比较值之前尝试将 Dto1 中的 DateTime 转换为 Dto2 中的字符串。但是由于 DateTime 的字符串表示取决于线程的文化,它不会给你可预测的结果。但是,如果您切换 o1 和 o2,如果 Convert.ChangeType 成功地将您的短日期时间转换回 DateTIme 对象,我不会感到惊讶。

作为旁注,我的 DTO 通常只是将 DateTime 传递给调用者,而不进行任何字符串转换。我相信 DateTime 的实际表示纯粹是 UI 责任。

HTH

丹尼斯

【讨论】:

感谢您的回答。我知道 DateTime 转换取决于文化——这只是一个例子。只是想知道为什么EqualTo<T>() 不允许方法链接:) BTW fluentassertions 很棒——谢谢你的工作。

以上是关于比较某些道具具有不同格式的对象的主要内容,如果未能解决你的问题,请参考以下文章

具有不同时区的两个“时间”对象的比较

Kellerman Compare .NET Objects:比较具有不同属性名称的不同类型的对象

ArangoDB比较不同数据库中的文件

在 React 中渲染具有不同状态的组件数组

HQL:如何选择某些列不同的所有实体?

JSON 可解码嵌套数组具有不同的格式和类型