【问题标题】:Unexpected result when comparing values retrieved with PropertyInfo.GetValue()比较使用 PropertyInfo.GetValue() 检索到的值时出现意外结果
【发布时间】:2010-11-09 23:38:04
【问题描述】:

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

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 的类,它有几个属性,所有这些都是简单的数据类型(字符串、整数等)。我在我的单元测试代码中创建了一个实例,另一个由我的 DataModel 创建,从数据库中获取数据(MySql,我使用的是 MySqlConnector)。

尽管调试器显示属性值是相同的,但上面代码中的比较还是失败了。

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

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

一切都如我所料。如果我直接在 UnitTest 中创建 PurchaseOrder 实例,比较也不会失败。

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

【问题讨论】:

    标签: c# reflection properties comparison


    【解决方案1】:

    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)强制值类型 == 行为。

    【讨论】:

    • 完美运行,非常感谢。 null 在那里,因为我不想让代码示例过于复杂。
    【解决方案2】:

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

    【讨论】:

    • 没错。我本可以早点想到的。 :) 感谢您的回复!
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2012-08-25
    • 2018-08-23
    • 1970-01-01
    • 2019-12-21
    • 2013-11-07
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多