C# 比较反射类型返回False
以下面的代码片段为例。。。此代码获取两个对象—一个原始对象和具有某些可能已更改属性的同一对象—并循环遍历每个属性,返回所有已更改属性及其新旧值的列表C# 比较反射类型返回False,c#,C#,以下面的代码片段为例。。。此代码获取两个对象—一个原始对象和具有某些可能已更改属性的同一对象—并循环遍历每个属性,返回所有已更改属性及其新旧值的列表 foreach (PropertyInfo property in newProperties) { PropertyInfo origProperty = origProperties.Where(p => p.Name == property.Name).Single(); object o
foreach (PropertyInfo property in newProperties)
{
PropertyInfo origProperty = origProperties.Where(p => p.Name == property.Name).Single();
object originalValue = origProperty.GetValue(original);
object newValue = property.GetValue(updated);
// This line always evaluates to true
if (Convert.ChangeType(originalValue, origProperty.PropertyType) != Convert.ChangeType(newValue, property.PropertyType))
{
dynamic modification = new ExpandoObject();
modification.Property = property.Name;
modification.OldValue = originalValue;
modification.NewValue = newValue;
modifications.Add(modification);
}
}
上面这一行的计算结果总是true。我也尝试过简单的方法:
if (originalValue != newValue)
但这也总是正确的
例如,在“局部变量”窗口中,它将属性{Int32 Id}和两者的值都显示为11。因此,条件的计算结果应该为False,但事实并非如此
有什么见解吗?使用Equals方法
foreach (PropertyInfo property in newProperties)
{
PropertyInfo origProperty = origProperties.Where(p => p.Name == property.Name).Single();
object originalValue = origProperty.GetValue(original);
object newValue = property.GetValue(updated);
// This line always evaluates to true
if (!originalValue.Equals(newValue))
{
dynamic modification = new ExpandoObject();
modification.Property = property.Name;
modification.OldValue = originalValue;
modification.NewValue = newValue;
modifications.Add(modification);
}
}
对象是引用类型,所以originalValue和newValue是同一个对象吗?我不确定我是否理解你的问题。originalValue和newValue属于同一类型的对象。但是,一个是原始对象,另一个是具有新值的对象。@Alex这不就是返回基础类型吗?当然,类型是相同的,但我想检查值。我假设,从您测试的方式来看,在newProperties中,属性类型可能已更改,而属性名称保持不变,并且您希望测试属性类型或属性值是否有更改。正确吗?不,属性类型将保持不变。我正在比较来自具体类的两个对象。我只是想比较这些值,看看它们是否已经更改。添加空检查,您就可以了。@tgriffin好的,这样就可以了。首先,谢谢!第二,你介意告诉我为什么吗?==操作符将比较两个引用类型,看看它们是否是同一个对象,而.Equals允许你比较值。我认为您正在进行的转换调用导致引用类型。如果originalValue为null,这将引发NullReferenceException。