C # Отражение Property.GetValue () Проблема - PullRequest
2 голосов
/ 19 января 2011

У меня проблема со следующим кодом:

int errorCount = 0;
foreach (var cinf in client.GetType().GetProperties())
{
    var vinf = viewModel.GetType().GetProperty(cinf.Name);
    if (vinf != null)
    {
        if (cinf.GetValue(client, null) != vinf.GetValue(viewModel, null))
        {
            errorCount++;
        }
    }
}

Это автоматизированный тест, чтобы увидеть, работает ли отображение объекта модели из DTO. Если я использую более громоздкий способ написания этого для каждого свойства:

Assert.AreEqual(viewModel.ClientCompanyID, client.ClientCompanyID);

Это отлично работает.

Проблема в том, что код отражения неверно оценивает выражение «if val1! = Val2» (или так кажется). Если я перебираю этот код, оценка в основном говорит: «1 не равно 1» и неправильно добавляет ошибку. Кроме того, если я проверю это с помощью этого кода, я получу тот же на первый взгляд неверный результат:

var clientEx = client.GetType().GetProperty("ClientCompanyID");
var viewModelEx = viewModel.GetType().GetProperty("ClientCompanyID");
var clientVal = clientEx.GetValue(client, null);
var viewModelVal = viewModelEx.GetValue(viewModel, null);
bool test = (clientVal == viewModelVal);

bool возвращает false, даже когда, шагая по коду, clientVal = 1 и viewModelVal = 1. См. Прикрепленное изображение.

alt text

Любая помощь с этим будет принята с благодарностью!

Спасибо, ребята.

Тим.

РЕДАКТИРОВАТЬ: Могли бы дать вам все ответы. Рад, что это было просто в конце. Большое спасибо за вашу помощь. Приветствия.

Ответы [ 3 ]

3 голосов
/ 19 января 2011

Вам нужно сравнить с object.Equals() вместо использования равенства ссылок.Типы в штучной упаковке не будут сравниваться как равные без использования object.Equals().Попробуйте это:

if (!object.Equals(cinf.GetValue(client, null), vinf.GetValue(viewModel, null)))

Например, возьмем такой простой случай:

csharp> object a = 1;
csharp> object b = 1;
csharp> a == b;
false
csharp> object.Equals(a, b);
true
1 голос
/ 19 января 2011

Это только естественно. Если вы сравните объекты вместе, используя ==, он сравнит их ссылку, которая отличается.

Использование objectA.Equals(objectB).

1 голос
/ 19 января 2011

Вы сравниваете различные целые в штучной упаковке по ссылке.

Измените его на

if (!Equals(cinf.GetValue(client, null), vinf.GetValue(viewModel, null))

Это вызывает static Object.Equals метод , который вызовет virtual Object.Equals метод (после проверки null) для сравнения объектов по значению .

Вы увидите ту же проблему со строками.

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