Неожиданный результат при сравнении значений, полученных с помощью PropertyInfo.GetValue () - PullRequest
4 голосов
/ 11 июля 2009

У меня есть некоторый код, который я использую для циклического просмотра свойств определенных объектов и сравнения значений свойств, который выглядит примерно так:

public static bool AreObjectPropertyValuesEqual(object a, object b)
{

 if (a.GetType() != b.GetType())
  throw new ArgumentException("The objects must be of the same type.");

 Type type = a.GetType();

 foreach (PropertyInfo propInfo in type.GetProperties())
 {
  if (propInfo.GetValue(a, null) != propInfo.GetValue(b, null))
  {
   return false;
  }
 }
 return true;
}

Теперь о странном поведении. Я создал класс с именем PurchaseOrder с парой свойств, которые являются простыми типами данных (строки, целые и т. Д.). Я создаю один экземпляр в своем коде Unit-Test, а другой создается моей DataModel, извлекая данные из базы данных (MySql, я использую MySqlConnector).

Даже если отладчик показывает мне, что значения свойств идентичны, сравнение в приведенном выше коде не удается.

То есть: у моего объекта A, созданного в UnitTest, значение свойства Amount равно 10. Объект B, полученный из моего репозитория, имеет значение свойства Amount , равное 10. Сравнение не удалось ! Если я изменю код на

if (propInfo.GetValue(a, null).ToString() != propInfo.GetValue(b, null).ToString())
{
 ...
}

все работает так, как я ожидал. Сравнение также не завершится неудачей, если я создам PurchaseOrder экземпляров непосредственно в UnitTest.

Я был бы очень благодарен за любые ответы. Хорошего дня!

Ответы [ 2 ]

6 голосов
/ 11 июля 2009

PropertyInfo.GetValue возвращает объект, и ваш модульный тест выполняет == эталонное сравнение. Попробуйте вместо этого:

if (!propInfo.GetValue(a, null).Equals(propInfo.GetValue(b, null)))

Вы можете заменить null на что-то более разумное ...

Кроме того, вы можете попробовать:

if ((int?)propInfo.GetValue(a, null) != (int?)propInfo.GetValue(b, null))

(или любой простой тип, который у вас есть, если это не int), который вызывает тип значения == поведение.

1 голос
/ 11 июля 2009

Причина сбоя заключается в том, что тест на равенство, который применяется выше, является эталонным тестом на равенство. Поскольку два объекта, возвращаемые propInfo.GetValue(foo, null), хотя и равны по своим собственным определениям, являются отдельными объектами, их ссылки различны, и, следовательно, равенство не выполняется.

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