检测.NET对象的属性值的更改?

时间:2008-11-06 16:39:31

标签: .net properties object

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

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

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

CustomerController.Save(customer)

这通常是怎么做的?

4 个答案:

答案 0 :(得分:3)

一个好方法是在对象上有一个IsDirty标志,并且如果它们被更改,则所有setable属性都会更新该标志。在加载对象时将标志初始化为false。

示例属性如下所示:

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

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

您也可以选择始终保存对象,无论其是否已更改,我的偏好是使用标记。

答案 1 :(得分:3)

查看INotifyPropertyChanged界面。有关如何实现它的更详细说明,请here

答案 2 :(得分:1)

我不是专家,但我会在对象上使用boolean flag属性来指示它是脏的。我被打败了答案大声笑。

答案 3 :(得分: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);