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

时间:2011-03-17 12:05:29

标签: c# reflection

我得到value1value2,当它们应该相同时,它们都是零并且不相等。

我还能比较这两个对象的值吗?

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;
}

4 个答案:

答案 0 :(得分:11)

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

编辑:更好:使用静态Object.Equals(value1, value2)(@LukeH的积分)

答案 1 :(得分:4)

Equals继承自System.Object,如果您不提供自己的Equals实现,它将无法确保正确比较两个对象。

覆盖System.Object.Equals和/或在您的域对象中实现IEquatable<T>或您想要评估与另一个对象相等的任何对象。

了解更多内容阅读本文:

答案 2 :(得分:2)

if (value1 != value2)交换if (!object.Equals(value1, value2)),你应该好好去。

您当前使用的!=运算符是非虚拟运算符,并且由于GetValue调用的编译时类型为object,因此您将始终进行测试以供参考(不)平等。

首先使用静态object.Equals(x,y)方法测试参考相等性,如果对象不是相同的参考,则将遵循虚拟Equals方法。

答案 3 :(得分:1)

如果属性的类型是值类型(例如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

    }
}