Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.TypeBuilder.PropertyChangedAttribute.cs

 
using System;
using BLToolkit.Common;
using BLToolkit.TypeBuilder.Builders;

namespace BLToolkit.TypeBuilder
{
    /// <summary>
    /// This attribute allows to control generation of PropertyChanged notification at class level 
    /// </summary>
    [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class)]
    public sealed class PropertyChangedAttribute : AbstractTypeBuilderAttribute
    {
        /// <summary>
        /// Specifies default generation options should be used for PropertyChanged notification
        /// </summary>
        public PropertyChangedAttribute()
            :this(Common.Configuration.NotifyOnEqualSet)
        {
        }

        /// <summary>
        ///    This constructor allows control of PropertyChanged code generation
        /// </summary>
        /// <param name="notifyOnEqualSet">See <see cref="NotifyOnEqualSet"/></param>
        public PropertyChangedAttribute(bool notifyOnEqualSet)
            :this(notifyOnEqualSet, true)
        {
        }

        /// <summary>
        /// This constructor allows control of PropertyChanged code generation
        /// </summary>
        /// <param name="notifyOnEqualSet">See <see cref="NotifyOnEqualSet"/></param>
        /// <param name="useReferenceEquals">See <see cref="UseReferenceEquals"/></param>
        public PropertyChangedAttribute(bool notifyOnEqualSet, bool useReferenceEquals)
            :this(notifyOnEqualSet, useReferenceEquals, true)
        {
        }

        /// <summary>
        /// This constructor allows control of PropertyChanged code generation
        /// </summary>
        /// <param name="notifyOnEqualSet">See <see cref="NotifyOnEqualSet"/></param>
        /// <param name="useReferenceEquals">See <see cref="UseReferenceEquals"/></param>
        /// <param name="skipSetterOnNoChange">See <see cref="SkipSetterOnNoChange"/></param>
        public PropertyChangedAttribute(bool notifyOnEqualSet, bool useReferenceEquals, bool skipSetterOnNoChange)
        {
            _notifyOnEqualSet     = notifyOnEqualSet;
            _useReferenceEquals   = useReferenceEquals;
            _skipSetterOnNoChange = skipSetterOnNoChange;
        }

        private bool _notifyOnEqualSet;
        /// <summary>
        /// Controls whether OnPropertyChanged notifications are sent when current value is same as new one.
        /// 
        /// Default value controlled via <see cref="Configuration.NotifyOnEqualSet"/> and by default is set to false
        /// </summary>
        public  bool  NotifyOnEqualSet
        {
            get { return _notifyOnEqualSet;  }
            set { _notifyOnEqualSet = value; }
        }

        private bool _useReferenceEquals;
        /// <summary>
        /// Specifies if <see cref="Object.ReferenceEquals">Object.ReferenceEquals</see> should be used for equality comparison of current and new value
        /// for reference types. If value type implements op_Inequality, UseReferenceEquals is ignored.
        /// </summary>
        public  bool  UseReferenceEquals
        {
            get { return _useReferenceEquals;  }
            set { _useReferenceEquals = value; }
        }

        private bool _skipSetterOnNoChange;
        /// <summary>
        /// Specifies whether call to setter is made when current value is same as new one
        /// </summary>
        public  bool  SkipSetterOnNoChange
        {
            get { return _skipSetterOnNoChange;  }
            set { _skipSetterOnNoChange = value; }
        }

        public override IAbstractTypeBuilder TypeBuilder
        {
            get { return new PropertyChangedBuilder(_notifyOnEqualSet, _useReferenceEquals, _skipSetterOnNoChange); }
        }
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net