diff Source/TypeBuilder/PropertyChangedAttribute.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/PropertyChangedAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,91 @@
+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); }
+		}
+	}
+}