Сравнение двух значений из метода отражения GetValue - PullRequest
8 голосов
/ 17 марта 2011

Я получаю value1 и value2, которые оба равны нулю как не равные, когда они должны быть одинаковыми.

Как еще можно сравнить значения этих 2 объектов?

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 ]

12 голосов
/ 17 марта 2011

Это объекты, поэтому вы должны использовать value1.Equals(value2) с проверкой, не является ли value1 не null

РЕДАКТ.LukeH)

4 голосов
/ 17 марта 2011

Equals унаследован от System.Object, и он не гарантирует, что оба объекта будут корректно сравниваться, если вы не предоставите собственную реализацию Equals.

Переопределите System.Object.Equals и / или внедрите IEquatable<T> в свои доменные объекты или любой объект, для которого вы хотите оценить его равенство с другим.

Подробнее читайте в этой статье:

2 голосов
/ 17 марта 2011

Поменяйте if (value1 != value2) на if (!object.Equals(value1, value2)), и вы должны быть готовы.

Оператор !=, который вы используете в настоящее время, не является виртуальным, и так как тип времени компиляцииGetValue звонки - это object, вы всегда будете тестировать на равенство ссылок (в).

Вместо этого сначала используется статический метод object.Equals(x,y), и проверяется ли равенство ссылок.объекты, не совпадающие по ссылкам, будут переданы виртуальному методу Equals.

1 голос
/ 17 марта 2011

Если тип свойства является типом значения (например, 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

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...