比较使用PropertyInfo.GetValue()检索的值时出现意外结果

时间:2009-07-11 16:07:46

标签: c# reflection properties comparison

我有一些代码用于遍历某些对象的属性并比较属性值,看起来有点像这样:

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)。

虽然调试器告诉我,属性值是相同的,但上面代码中的比较失败了。

即:我在UnitTest中创建的对象A的 Amount 属性值为10.从我的存储库中检索的对象B的 Amount 属性值为10。比较失败!如果我将代码更改为

if (propInfo.GetValue(a, null).ToString() != propInfo.GetValue(b, null).ToString())
{
 ...
}
一切都按照我的预期运作。如果我直接在UnitTest中创建 PurchaseOrder 实例,那么比较也不会失败。

我非常感谢任何回答。祝你有个美好的一天!

2 个答案:

答案 0 :(得分:6)

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 :(得分:1)

失败的原因是上面应用的相等测试是参考相等测试。由于propInfo.GetValue(foo, null)返回的两个对象虽然等于它们自己的定义,但它们是单独的对象,它们的引用是不同的,因此相等性失败。