PropertyInfo.GetValue无法比较日期时间?

时间:2014-08-05 19:35:11

标签: c#

我循环浏览两个对象,看看两个对象中的所有项是否相同。在返回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;
}

3 个答案:

答案 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代替==