【问题标题】:Detecting changes in property values of a .NET object?检测 .NET 对象的属性值的变化?
【发布时间】:2010-09-21 03:03:00
【问题描述】:

我有一个用于插入/显示更新的表单。在编辑模式 (update) 中,当我将我的 BO 传回控制器时,为了执行更新,检查任何属性值是否已更改的最佳方法是什么到数据存储区?

textbox1.text = CustomerController.GetCustomerInformation(id).Name

从控制器返回一个客户对象。我需要检查对象是否脏以执行更新。当我这样做时,我会假设从客户端发送的对象必须与从控制器发送的对象进行比较:

CustomerController.Save(customer)

这通常是怎么做的?

【问题讨论】:

  • 答案是很好的第一步,但是如果在提交到数据库之前将属性设置回原始值怎么办?对象不再是脏的。这是迄今为止所有答案都没有涵盖的内容......

标签: .net properties object


【解决方案1】:

请注意,“脏标志方法”(以其简单形式)适用于值类型(int、bool、...)和字符串,但不适用于引用类型。例如。如果属性是List<int>Address 类型,则可以将其设置为“脏”而不调用setter 方法(myCust.Address.City = "..." 只调用getter 方法)。

如果是这种情况,您可能会发现基于反射的方法很有用(将以下方法添加到您的 BO):

public bool IsDirty(object other)
{
  if (other == null || this.GetType() != other.GetType())
    throw new ArgumentException("other");

  foreach (PropertyInfo pi in this.GetType().GetProperties())
  {
     if (pi.GetValue(this, null) != pi.GetValue(other, null))
       return true;
  }
  return false;
}

你可以这样使用它:

Customer customer = new Customer();
// ... set all properties
if (customer.IsDirty(CustomerController.GetCustomerInformation(id)))
  CustomerController.Save(customer);

【讨论】:

    【解决方案2】:

    看看INotifyPropertyChanged 接口。 here 提供了有关如何实现它的更详细说明。

    【讨论】:

      【解决方案3】:

      一个好方法是在对象上设置一个 IsDirty 标志,并让所有可设置的属性在更改时更新该标志。加载对象时将标志初始化为 false。

      示例属性如下所示:

      public string Name {
          get { return _name; }
          set {
              _name = value;
              _isDirty = true;
          }
      }
      

      然后,当您取回对象时,您可以简单地检查Customer.IsDirty 以查看您是否需要将更改提交到数据库。作为额外的奖励,您可以从生成的文本中获得一些幽默:)(哦,那些肮脏的客户

      您也可以选择始终保存对象,无论它是否已更改,我更喜欢使用标志。

      【讨论】:

      • 将 IsDirty 属性放在 Customer 将从其继承的 BaseObject 上。
      • 客户对象上的属性必须知道更新标志。
      • 哦,真的。我的想法不同..如果一个属性很脏,不妨更新所有属性。因为您将在 Customer 表上进行更新。
      • @vfilby:这并没有改变在所有业务对象的基类上使用 IsDirty 的用处。
      • 如果我在 DAL 中设置属性并将对象传递给控制器​​,然后控制器将其传递给表单,在表单级别它已经脏了..不是吗?因为我已经在 DAL 中设置了属性。然后我需要在控制器级别将脏设置为 false。
      【解决方案4】:

      我不是专家,但我会在对象上使用布尔标志属性来指示它是脏的。我被打败了,哈哈。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        • 2013-05-22
        • 2017-08-18
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        相关资源
        最近更新 更多