我有两个复杂对象(即具有字符串、整数、双精度浮点数、列表和其他自定义数据类型的对象),这两个对象属于同一类型。我想比较它们之间的内容,以确保它们完全相同。注意:该对象未实现.Equals方法(我无法控制),也没有实现IComparable接口。
是否有一种通用的方式(反射?)来比较这两个对象的内容?
谢谢!
我有两个复杂对象(即具有字符串、整数、双精度浮点数、列表和其他自定义数据类型的对象),这两个对象属于同一类型。我想比较它们之间的内容,以确保它们完全相同。注意:该对象未实现.Equals方法(我无法控制),也没有实现IComparable接口。
是否有一种通用的方式(反射?)来比较这两个对象的内容?
谢谢!
感谢Marc提供的MemoryStream方法。当我看到参数中有"this"时,我还以为出现了错误,但令人惊讶的是编译器实际上允许这样做,对吧?我稍微改了一下,选择重写Equals()方法。同时也值得称赞的是使用了长度和数组比较而不是SequenceEquals()。写起来会多花费一些时间,但根据http://www.dotnetperls.com/sequenceequal,性能更好。
public override bool Equals(object obj)
{
// If comparison object is null or is a different type, no further comparisons are necessary...
if (obj == null || GetType() != obj.GetType())
{
return false;
}
// Compare objects using byte arrays...
using (MemoryStream memStream = new MemoryStream())
{
BinaryFormatter binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
// Get byte array of "this" object...
binaryFormatter.Serialize(memStream, this);
byte[] b1 = memStream.ToArray();
// Get byte array of object to be compared...
memStream.SetLength(0);
binaryFormatter.Serialize(memStream, obj);
byte[] b2 = memStream.ToArray();
// Compare array sizes. If equal, no further comparisons are necessary...
if (b1.Length != b2.Length)
return false;
// If sizes are equal, compare each byte while inequality is not found...
for (int i = 0; i < b1.Length; i++)
{
if (b1[i] != b2[i])
return false;
}
}
return true;
}
你可以编写一些逻辑来比较两个对象的所有属性。当涉及到具有复杂子类型的对象图时,这会变得复杂,因此您需要确定什么程度的接近是足够好的。