C# 比较GetValue反射方法中的两个值

C# 比较GetValue反射方法中的两个值,c#,reflection,C#,Reflection,我得到的value1和value2都是零,当它们应该相同时,它们不相等 我还可以如何比较这两个对象的值 private bool CheckProjectIsUnique( TBR.Domain.Project project, List<UniqueProjectType> types, out UniqueProjectType uniqueCandidate) { uniqueCandidate = CreateUniqueProjectType

我得到的
value1
value2
都是零,当它们应该相同时,它们不相等

我还可以如何比较这两个对象的值

private bool CheckProjectIsUnique(
    TBR.Domain.Project project,
    List<UniqueProjectType> types,
    out UniqueProjectType uniqueCandidate)
{
    uniqueCandidate = CreateUniqueProjectType(project);

    if (types.Count == 0)
        return true;

    foreach (UniqueProjectType type in types)
    {
        bool exists = true;
        foreach (PropertyInfo prop in type.GetType().GetProperties())
        {
            var value1 = prop.GetValue(type, null);
            var value2 = prop.GetValue(uniqueCandidate, null);
             if (value1 != value2)
             {
                 exists = false;
                 break;
             }
        }
        if (exists)
            return true;
    }

    return false;
}
private bool checkprojectsunique(
TBR.Domain.Project项目,
列表类型,
输出唯一项目类型(唯一候选人)
{
uniqueCandidate=CreateUniqueProjectType(项目);
如果(types.Count==0)
返回true;
foreach(类型中的UniqueProjectType)
{
布尔存在=真;
foreach(type.GetType().GetProperties()中的PropertyInfo属性)
{
var value1=prop.GetValue(类型,null);
var value2=prop.GetValue(uniqueCandidate,null);
如果(值1!=值2)
{
存在=假;
打破
}
}
如果(存在)
返回true;
}
返回false;
}

它们是对象,因此应使用
value1.Equals(value2)
检查
value1
是否为
null


编辑:更好:使用静态
对象。Equals(value1,value2)
(归功于@LukeH)

Equals是从System.Object继承而来的,如果您不提供自己的Equals实现,则无法确保正确比较这两个对象

覆盖System.Object.Equals和/或在域对象或任何要评估其与另一个对象相等性的对象中实现
IEquatable

阅读本文了解更多信息:

if(value1!=value2)
交换为
if(!object.Equals(value1,value2))
,您应该准备好了

=运算符是非虚拟的,并且由于
GetValue
调用的编译时类型是
object
,因此您将始终测试引用(in)是否相等


使用静态方法首先测试引用是否相等,如果对象不相同,则引用将遵循虚拟方法。

如果属性的类型是值类型(例如int),则GetValue返回的值将被装箱到对象中。然后,
=
将比较这些装箱值的引用。如果要进行正确的比较,应使用Equals方法:

class Program
{
    class Test
    {
        public int A { get; set; }
    }

    static void Main(string[] args)
    {
        var testA = new Test { A = 1 };
        var testB = new Test { A = 1 };

        var propertyInfo = typeof(Test).GetProperties().Where(p => p.Name == "A").Single();

        var valueA = propertyInfo.GetValue(testA, null);
        var valueB = propertyInfo.GetValue(testB, null);

        var result = valueA == valueB; // False
        var resultEquals = valueA.Equals(valueB); // True

    }
}

或者使用静态
对象.Equals(value1,value2)
方法,该方法将为您处理空值检查。OP使用非多态
=
上的code>运算符,因此不管您是否重写
Equals或实现IEquatable,OP的代码都在测试引用是否相等。但他正在尝试评估值1和值2是否相等。这不是关于推荐信,是吗DOr如果我错了,那么他需要写一个更好的问题,因为他需要指定他是否想要一个引用或值相等。