我有一些代码用于遍历某些对象的属性并比较属性值,看起来有点像这样:
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 实例,那么比较也不会失败。
我非常感谢任何回答。祝你有个美好的一天!
答案 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)
返回的两个对象虽然等于它们自己的定义,但它们是单独的对象,它们的引用是不同的,因此相等性失败。