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

本文关键字:格式 对象 比较 | 更新日期: 2023-09-27 18:21:55

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

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

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();

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

第一个例子通常是最好的方法。然而,如果你想切换o1和o2,它可能会在一次通话中工作。Fluent Assertions将尝试(使用convert.ChangeType)将属性的实际值转换为同名属性的预期值。在您的特定示例中,在比较值之前,它会尝试将Dto1中的DateTime转换为Dto2中的字符串。但是,由于DateTime的字符串表示依赖于线程的区域性,因此它不会给您提供可预测的结果。然而,如果你切换o1和o2,如果Convert.ChangeType成功地将你的短日期时间转换回datetime对象,我不会感到惊讶。

顺便说一句,我的DTO通常只将DateTime传递给调用者,而不进行任何字符串转换。我认为DateTime的实际表示纯粹是UI的责任。

HTH-

Dennis