我正在尝试构建预算最多的 ORM。我有 2 个对象,一个“项目”和一个“原始”,在创建项目时,我只需将其副本保存在一个名为“原始”的变量中。该副本是通过我从这篇文章中窃取的扩展创建的https://stackoverflow.com/a/11308879/10647851所以我想构建我的更新查询,我认为非常简单。foreach (PropertyInfo prop in properties) { var one = prop.GetValue(original, null); var typeOne = one.GetType(); var two = prop.GetValue(item, null); var typeTwo = two.GetType(); if(one != two) { ... }}然而,在某些您意想不到的情况下,一不等于二。ID(模型中的类型= int?)2703不等于2703。我单步执行代码,类型是Int32。布尔值也是问题。字符串起作用。日期时间?的工作。
1 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
使用
if(!object.Equals(one, two)) { ... }
而是进行相等比较。这将调用默认的相等比较器或已实现它的那些类型的重写比较器(其中包括所有值类型,例如示例中的 int )。
!= 使用引用相等,因此当引用的类型是完全相同的实例时会产生相同的值。由于您使用的是返回对象的 GetValue,因此使用 != 会给您带来意想不到的结果。
public object GetValue(object obj)
因为一和二实际上是引用类型(即它们是装箱整数而不是值类型),所以“==”比较器执行引用相等性检查。
- 1 回答
- 0 关注
- 72 浏览
添加回答
举报
0/150
提交
取消