比较由反射产生的两个PropertyInfo的枚举

时间:2013-10-05 09:54:43

标签: c# .net reflection

我有两种状态的对象,我想比较初始状态和最终状态。我通过反射捕获特定状态的所有注释属性,我想比较两种状态以检查它们是否相等,或者没有。我有这个尝试,但我相信它效率低下 - 它不起作用: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;
    }

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

1 个答案:

答案 0 :(得分:2)

当您使用Objects(或==)运算符比较两个!=时,您实际上正在使用System.Object.Equals()方法,而您几乎肯定不喜欢实施,这就是为什么你说它不起作用。除非您使用的类型重写了这一点以提供有意义的同情,否则您将获得框架提供的实现,并实际测试身份,而不是有意义的相等。

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

解决方案取决于您的属性类型。如果您已实施,请考虑自己实施Equals()。如果你没有实现它们,那么你需要找到另一种方式。