c# - (是否有)简单的方法来检查(复杂)pocommodel 中的属性是否已更改?

标签 c#

我想知道是否有一种“简单”/好的方法来检查属性是否已更改。就像在下面的层次结构中,当 Child.Name 发生变化时(isDirty)我想知道。

GrantParent
- Parent
-- Child

在我目前的情况下,我需要浏览模型以查看是否有任何更改。

ps: 我正在使用 IChangeTracking

一直在考虑缓存序列化对象的散列。 (太慢了?)

或者创建 changedevent 调用父级直到它到达 grantparent。 (健谈?)

  public class Parent: BaseEntity
  {
    private Child _child;
    public Child Child
    {
      get { return _child; }
      set { _child = value; OnPropertyChanged("Child"); }
    }
  }

  public class Child : BaseEntity
  {
    private  int _id;
    public int Id {
      get { return _id; }
      set { _id = value; OnPropertyChanged("Id"); }
    }
  }



 [DataContract]
  [Serializable]
  public abstract class BaseEntity : INotifyPropertyChanged
  {
    protected BaseEntity()
    {
      PropertyChanged += PropertyChangedEventHandler;
    }

    private void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e)
    {
      if (e != null && !String.Equals(e.PropertyName, "IsChanged", StringComparison.Ordinal))
      {
        this.IsChanged = true;
      }
    }

    protected void OnPropertyChanged<T>(Expression<Func<T>> property)
    {
      MemberExpression me = property.Body as MemberExpression;
      if (me == null || me.Expression != property.Parameters[0]
            || me.Member.MemberType != MemberTypes.Property)
      {
        throw new InvalidOperationException(
            "Now tell me about the property");
      }
      var handler = PropertyChanged;
      if (handler != null) handler(this,
        new PropertyChangedEventArgs(me.Member.Name));
    }

    [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public bool IsChanged
    {
      get
      {
        lock (_notifyingObjectIsChangedSyncRoot)
        {
          return _notifyingObjectIsChanged;
        }
      }

      protected set
      {
        lock (_notifyingObjectIsChangedSyncRoot)
        {
          if (!Boolean.Equals(_notifyingObjectIsChanged, value))
          {
            _notifyingObjectIsChanged = value;

            if (IsDirtyChanged != null)
              IsDirtyChanged();

            this.OnPropertyChanged("IsChanged");
          }
        }
      }
    }

    private bool _notifyingObjectIsChanged;
    private readonly object _notifyingObjectIsChangedSyncRoot = new Object();

    public void AcceptChanges()
    {
      this.IsChanged = false;
    }
  }

最后 我对来 self 已经使用的 XML 序列化程序的 XML 模型进行了比较。我并不“需要”每秒一次(左右)的即时变化检测就足够了。现在,我用上次保存后的模型检查 XML 模型。

最佳答案

您需要让每个属性自己跟踪它,或者存储一些指示哪些属性已更改的信息,或者可能在项目更改时触发事件。

基本上每个属性都将具有与此类似的逻辑:

public class MyClass : INotifyPropertyChanged
{
    private int _value;
    public int Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Value"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

这将允许您向 PropertyChanged 事件添加事件处理程序,以便在更改属性时触发代码。

关于c# - (是否有)简单的方法来检查(复杂)pocommodel 中的属性是否已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13088676/

相关文章:

c# - .Net 中的 GridView 问题

c# - 多个List<int>的混排组合

c# - 单击时突出显示 <li> 元素并在页面加载后保持突出显示

c# - 从 VS2012 升级到 VS2013 后 SGEN 不起作用

c# - 按 Enter 键而不是单击 C# 中的按钮

c# - 在 iframe 中显示 aspx,aspx 显示 pdf

c# - 如何获取DNS中的TTL(Time To Live)?

c# - 如何将此 SQL 查询转换为 EF Core 中的 LINQ 查询?

c# - 创建一个 LINQ 查询,其中包含本周的所有条目(今天和昨天除外)

c# - HttpRequestException 在 Windows Phone 中的激活事件中使用 HttpClient