我循环浏览两个对象,看看两个对象中的所有项是否相同。在返回false的位置添加监视后,我看到相同的值。被比较的两个项目都是日期时间。它们具有完全相同的值,但返回false。我的问题是考虑到这两个项目都是日期时间,是否会导致问题?如果没有,是否有更好的方法来比较我的两个对象?
private bool CompareObj(Visit object1, Visit object2)
{
foreach (var obj1PropertyInfo in object1.GetType().GetProperties())
{
foreach (var obj2PropertyInfo in object2.GetType().GetProperties())
{
if (obj1PropertyInfo.Name == obj2PropertyInfo.Name && obj1PropertyInfo.GetValue(object1, null) != obj2PropertyInfo.GetValue(object2, null))
{
return false;
}
}
}
return true;
}
答案 0 :(得分:2)
这是一种linq方式:
return object1
.GetType()
.GetProperties()
.All(x => object.Equals(x.GetValue(object1), x.GetValue(object2));
答案 1 :(得分:1)
使用Equals(也适用于空值)
private bool CompareObj(Visit object1, Visit object2)
{
foreach (var obj1PropertyInfo in object1.GetType().GetProperties())
{
foreach (var obj2PropertyInfo in object2.GetType().GetProperties())
{
if (obj1PropertyInfo.Name == obj2PropertyInfo.Name
&& !Equals(obj1PropertyInfo.GetValue(object1, null),
obj2PropertyInfo.GetValue(object2, null)))
{
return false;
}
}
}
return true;
}
答案 2 :(得分:0)
感谢Michael Lieu首先提出这个建议,但我会把它放在答案中,因为他没有。
如果您只对对象相等感兴趣(而不是对象是否共享相同的引用),请使用.Equals
方法。默认情况下(即,假设它没有超载),==
比较引用,在您的情况下(可能)是相同的,因为它们是DateTime
的2个不同实例。
这一切都假设您正在比较2个DateTime
个实例,当然:
private bool CompareObj(访问object1,访问object2)
{
return object.Equals(object1,object2);
}
如果要比较更复杂的对象,可能需要带有反射的循环来迭代属性。
摘要:如果您只对相等感兴趣,但不关心引用是否相同,请使用Equals
代替==
。