我建议不要使用反射或任何复杂的东西,它只会增加更多的工作/维护。
序列化对象(我推荐 json)和字符串比较它们。我不确定您为什么反对订购,但我仍然推荐它,因为它会为每种类型保存自定义比较。
它会自动处理域对象的变化。
示例(SharpTestsEx for fluent)
using Newtonsoft.Json;
using SharpTestsEx;
JsonConvert.SerializeObject(actual).Should().Be.EqualTo(JsonConvert.SerializeObject(expected));
您可以将其编写为简单的扩展并使其更具可读性。
public static class CollectionAssertExtensions
{
public static void CollectionAreEqual<T>(this IEnumerable<T> actual, IEnumerable<T> expected)
{
JsonConvert.SerializeObject(actual).Should().Be.EqualTo(JsonConvert.SerializeObject(expected));
}
}
然后使用您的示例调用它,如下所示:
var foundCollection = fooManager.LoadFoo();
var expectedCollection = new List<Foo>()
{
new Foo() { Bar = "a", Bar2 = "b" },
new Foo() { Bar = "c", Bar2 = "d" }
};
foundCollection.CollectionAreEqual(foundCollection);
您将收到如下断言消息:
...:"a","Bar2":"b"},{"Bar":"d","Bar2":"d"}]
...:"a","Bar2":"b"},{"Bar":"c","Bar2":"d"}]
... _ __ _ __ _ __ _ __ _ __ _ __^ _ __ _ _