public class Obj
{
public int Prop1 { get; set; }
public string Prop2 { get; set; }
}
public class Comparator<T> : IEqualityComparer<T>
{
public bool Equals(T x, T y)
{
return JsonConvert.SerializeObject(x) == JsonConvert.SerializeObject(y);
}
public int GetHashCode(T obj)
{
return JsonConvert.SerializeObject(obj).GetHashCode();
}
}
Obj o1 = new Obj { Prop1 = 1, Prop2 = "1" };
Obj o2 = new Obj { Prop1 = 1, Prop2 = "2" };
bool result = new Comparator<Obj>().Equals(o1, o2);
我已经进行了测试,它可以工作。它是通用的,因此可以代表各种对象,但我想知道这种比较对象的方法有哪些缺点?在这个问题中提出了这种方法,并获得了一些赞同,但我无法理解为什么这不被认为是最好的方法,如果有人只想比较两个对象的属性值? 编辑:我严格指的是Json序列化,而不是XML。
我之所以问这个问题,是因为我想为一个单元测试项目创建一个简单通用的
Comparator
,所以比较的性能并不是很重要,因为我知道这可能是最大的缺点之一。此外,在Newtonsoft.Json的情况下,可以使用TypeNameHandling
属性设置为All
来处理类型问题。
JToken.DeepEquals()
用于比较两个序列化对象。 - dbcreturn obj.GetHashCode()
,默认的哈希函数使用了和Equals相同的逻辑,但是由于你改变了Equals的行为,所以哈希值现在是不正确的。因为很多进程在检查哈希值是否相等后才会调用Equals,所以现在的情况可能会导致非常奇怪的结果。 - MikeT