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

C# 比较某些道具具有不同格式的对象,c#,tdd,fluent-assertions,C#,Tdd,Fluent Assertions,比较两个对象的所有属性的最佳方法是什么,其中一些对象具有不同的格式(例如,一个对象的DateTime,另一个对象的DateTime.ToString()具有自定义格式) 我可以通过使用两个断言来实现这一点: o1.ShouldHave().AllPropertiesBut(dto1 => dto1.Date).EqualTo(o2); o1.Date.Should().Be(DateTime.Parse(o2.Date)); 我会考虑以下内容,但这不会编译,因为EqualTo()是无效的

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

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

o1.ShouldHave().AllPropertiesBut(dto1 => dto1.Date).EqualTo(o2);
o1.Date.Should().Be(DateTime.Parse(o2.Date));
我会考虑以下内容,但这不会编译,因为
EqualTo()
是无效的

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断言将尝试(使用convert.ChangeType)将属性的实际值转换为同名属性的预期值。在您的特定示例中,它将尝试在比较值之前将Dto1中的日期时间转换为Dto2中的字符串。但是,由于DateTime的字符串表示依赖于线程的区域性,因此它不会提供可预测的结果。但是,如果您切换o1和o2,如果Convert.ChangeType将成功地将短datetime转换回datetime对象,我也不会感到惊讶

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


丹尼斯

谢谢你的回答。我知道DateTime转换依赖于区域性——这只是一个例子。我只是想知道为什么
EqualTo()
不允许方法链接:)顺便说一句,fluentassertions非常棒——对你的工作来说是个好主意。