为了账号安全,请及时绑定邮箱和手机立即绑定

将属性值与反射进行比较

将属性值与反射进行比较

C#
POPMUISE 2023-09-24 10:49:16
我正在尝试构建预算最多的 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)

因为一和二实际上是引用类型(即它们是装箱整数而不是值类型),所以“==”比较器执行引用相等性检查。


查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 72 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信