将属性值与反射进行比较

我正在尝试构建预算最多的 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。布尔值也是问题。字符串起作用。日期时间?的工作。


POPMUISE
浏览 79回答 1
1回答

凤凰求蛊

使用if(!object.Equals(one, two)) { ... }而是进行相等比较。这将调用默认的相等比较器或已实现它的那些类型的重写比较器(其中包括所有值类型,例如示例中的 int )。!= 使用引用相等,因此当引用的类型是完全相同的实例时会产生相同的值。由于您使用的是返回对象的 GetValue,因此使用 != 会给您带来意想不到的结果。public object GetValue(object obj)因为一和二实际上是引用类型(即它们是装箱整数而不是值类型),所以“==”比较器执行引用相等性检查。
打开App,查看更多内容
随时随地看视频慕课网APP