c# marking class property as dirty

前端 未结 11 2354
盖世英雄少女心
盖世英雄少女心 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:10

    If you want to implement it in this way, and you want to reduce the amount of code, you might consider applying Aspect Oriented Programming.

    You can for instance use a compile-time weaver like PostSharp , and create an 'aspect' that can be applied to properties. This aspect then makes sure that your dirty flag is set when appropriate.

    The aspect can look like this:

    [Serializable]
    [AttributeUsage(AttributeTargets.Property)]
    public class ChangeTrackingAttribute : OnMethodInvocationAspect
    {
        public override void OnInvocation( MethodInvocationEventArgs e )
        {
            if( e.Delegate.Method.ReturnParameter.ParameterType == typeof(void) )
            {
                  // we're in the setter
                  IChangeTrackable target = e.Delegate.Target as IChangeTrackable;
    
                  // Implement some logic to retrieve the current value of 
                  // the property
                  if( currentValue != e.GetArgumentArray()[0] )
                  {
                      target.Status = Status.Dirty;
                  }
                  base.OnInvocation (e);
            } 
        }  
    } 
    

    Offcourse, this means that the classes for which you want to implement ChangeTracking, should implement the IChangeTrackable interface (custom interface), which has at least the 'Status' property.

    You can also create a custom attribute ChangeTrackingProperty, and make sure that the aspect that has been created above, is only applied to properties that are decorated with this ChangeTrackingProperty attribute.

    For instance:

    public class Customer : IChangeTrackable
    {
        public DirtyState Status
        {
            get; set;
        }
    
        [ChangeTrackingProperty]
        public string Name
        { get; set; }
    }
    

    This is a little bit how I see it. You can even make sure that PostSharp checks at compile-time whether classes that have properties that are decorated with the ChangeTrackingProperty attribute, implement the IChangeTrackable interface.

提交回复
热议问题