我有两种状态的对象,我想比较初始状态和最终状态。我通过反射捕获特定状态的所有注释属性,我想比较两种状态以检查它们是否相等,或者没有。我有这个尝试,但我相信它效率低下 - 它不起作用: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;
}
//最终和初始视图模型是我从中提取属性的对象,它们是对象类型。
答案 0 :(得分:2)
当您使用Objects
(或==
)运算符比较两个!=
时,您实际上正在使用System.Object.Equals()
方法,而您几乎肯定不喜欢实施,这就是为什么你说它不起作用。除非您使用的类型重写了这一点以提供有意义的同情,否则您将获得框架提供的实现,并实际测试身份,而不是有意义的相等。
如果您的属性属于提供正确行为(String
,Int32
等)的简单类型,那么您的代码将起作用。由于它不是,您的类型不会以您认为有意义的方式实现System.Object.Equals()
。您可能想要的是“深度实例比较”的形式,如果两个对象的类型相同且每个对应的字段也相等,则认为这两个对象是相等的。好吧,你不明白!
解决方案取决于您的属性类型。如果您已实施,请考虑自己实施Equals()
。如果你没有实现它们,那么你需要找到另一种方式。