c# marking class property as dirty

前端 未结 11 2343
盖世英雄少女心
盖世英雄少女心 2020-11-29 19:32

The following is a simple example of an enum which defines the state of an object and a class which shows the implementation of this enum.

public enum Status         


        
11条回答
  •  既然无缘
    2020-11-29 20:17

    Here is how i do it.

    In cases where i do not need to test for specific fields being dirty, I have an abstract class:

    public abstract class SmartWrap : ISmartWrap
    {
        private int orig_hashcode { get; set; }
        private bool _isInterimDirty;
    
        public bool IsDirty
        {
            get { return !(this.orig_hashcode == this.GetClassHashCode()); }
            set
            {
                if (value)
                    this.orig_hashcode = this.orig_hashcode ^ 108.GetHashCode();
                else
                    MakeClean();
            }
        }
    
        public void MakeClean()
        {
            this.orig_hashcode = GetClassHashCode();
            this._isInterimDirty = false;
        }
    
        // must be overridden to return combined hashcodes of fields testing for
        // example Field1.GetHashCode() ^ Field2.GetHashCode() 
        protected abstract int GetClassHashCode();
    
        public bool IsInterimDirty
        {
            get { return _isInterimDirty; }
        }
    
        public void SetIterimDirtyState()
        {
            _isInterimDirty = this.IsDirty;
        }
    
        public void MakeCleanIfInterimClean()
        {
            if (!IsInterimDirty)
                MakeClean();
        }
    
        /// 
        /// Must be overridden with whatever valid tests are needed to make sure required field values are present.
        /// 
        public abstract bool IsValid { get; }
    }
    

    }

    As well as an interface

    public interface ISmartWrap
    {
        bool IsDirty { get; set; }
        void MakeClean();
        bool IsInterimDirty { get;  }
        void SetIterimDirtyState();
        void MakeCleanIfInterimClean();
    }
    

    This allows me to do partial saves, and preserve the IsDirty state if there is other details to save. Not perfect, but covers a lot of ground.

    Example of usage with interim IsDirty State (Error wrapping and validation removed for clarity):

                area.SetIterimDirtyState();
    
                if (!UpdateClaimAndStatus(area))
                    return false;
    
                area.MakeCleanIfInterimClean();
    
                return true;
    

    This is good for most scenarios, however for some classes i want to test for each field with a backing field of original data, and either return a list of changes or at least an enum of fields changed. With an enum of fields changed i can then push that up through a message chain for selective update of fields in remote caches.

提交回复
热议问题