Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较反射类型返回False_C# - Fatal编程技术网

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。