0

我有两种对象状态,我想比较初始状态和最终状态。我通过反射捕获特定状态的所有注释属性,我想比较这两种状态以检查它们是否相等。我尝试一下,但我相信它的效率更低——它不起作用:D。

private static bool areSame(IEnumerable<PropertyInfo> initial,IEnumerable<PropertyInfo> final)
    {


        foreach (PropertyInfo initialPropertyInfo in initial)
        {
            foreach (PropertyInfo finalPropertyInfo in final)
            {
                if (initialPropertyInfo.Name == finalPropertyInfo.Name)
                {
                    if (initialPropertyInfo.GetValue(initialViewModel) != finalPropertyInfo.GetValue(finalViewModel))
                  //  Console.WriteLine(initialPropertyInfo.GetValue(initialViewModel));
                        return false;
                }
            }
        }
        return true;
    }

//最终和初始视图模型是我从中提取属性的对象,它们是对象类型。

4

1 回答 1

2

当您Objects使用==(or !=) 运算符比较两个时,您实际上是在使用该System.Object.Equals()方法,并且您几乎可以肯定不喜欢该实现,这就是您说它不起作用的原因。除非您使用的类型已覆盖它以提供有意义的同情,否则您将获得框架提供的实现并且实际上测试身份,而不是有意义的平等。

如果您的属性是提供正确相等行为( , 等)的简单类型,String那么Int32您的代码将起作用。因为它没有,所以您的类型不会System.Object.Equals()以您认为有意义的方式实现。您可能想要的是一种“深度实例比较”的形式,如果两个对象的类型相同并且每个对应的字段也相等,则它们被认为是相等的。好吧,你不明白!

解决方案取决于您的属性的类型。如果您实施了,那么请考虑Equals()自己实施。如果您没有实施它们,那么您将需要找到其他方法。

于 2013-10-05T10:08:50.153 回答