如何检查对象是否已更改?

wil*_*lem 18 c#

我有一个对象,其中包含其他对象,其中包含其他对象,包括列表等.此对象是数据绑定到表单,在不同的选项卡中向用户公开了许多字段.我还使用了master-child datagridviews.

任何想法如何检查此对象中是否有任何相对于早期时刻发生了变化?不(手动)添加已更改的变量,在所有(> 100)设置方法中设置为true.

Moo*_*ice 8

正如Sll所说,一个脏的界面绝对是一个好方法.进一步说,我们希望集合变脏,但我们不希望将所有子对象设置为脏.然而,我们可以做的是将它们的脏状态的结果与我们自己的脏状态结合起来.因为我们正在使用接口,所以我们将它留给对象来确定它们是否脏.

我的解决方案不会告诉你什么是脏的,只是任何时候任何对象的状态都是脏的.

public interface IDirty
{
    bool IsDirty { get; }
}   // eo interface IDirty


public class SomeObject : IDirty
{
    private string name_;
    private bool dirty_;

    public string Name
    {
        get { return name_; }
        set { name_ = value; dirty_ = true; }
    }
    public bool IsDirty { get { return dirty_; } }
}   // eo class SomeObject


public class SomeObjectWithChildren : IDirty
{
    private int averageGrades_;
    private bool dirty_;
    private List<IDirty> children_ = new List<IDirty>();

    public bool IsDirty
    {
        get
        {
            bool ret = dirty_;
            foreach (IDirty child in children_)
                dirty_ |= child.IsDirty;
            return ret;
        }
    }

}   // eo class SomeObjectWithChildren
Run Code Online (Sandbox Code Playgroud)


Bra*_*vic 3

您如何定义“平等”(新旧状态之间)?

  • 您是仅比较属性还是也比较字段?
  • 您只比较公共属性/字段吗?
  • 您是否曾经忽略过任何属性/字段(即它们的修改并不重要)?
  • 如何比较“原子”类型(例如,所有字符串比较都是不区分大小写的,或者在某些地方也需要区分大小写)。

如果这些问题的答案足够通用(即您可以设计一组适用于所有对象的规则),那么理论上您可以通过反射完成您想要的事情:基本思想是读取“的所有属性/字段” root”对象,然后存储“原子”对象并递归下降到“非原子”对象(并重复整个过程)。稍后,当您想要检查是否有任何更改时,您将重复递归下降并将结果与​​存储的值进行比较。

我并不是说这个解决方案特别高效甚至简单(您需要设计一个强大的命名约定来存储旧值并非常小心多线程),但它可能是通用的。