diff Source/Reflection/MemberAccessor.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/Reflection/MemberAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,305 @@
+using System;
+using System.Data.SqlTypes;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.ComponentModel;
+using BLToolkit.Data.Linq;
+
+#if !SILVERLIGHT && !DATA
+using BLToolkit.ComponentModel;
+#endif
+
+namespace BLToolkit.Reflection
+{
+	public abstract class MemberAccessor
+	{
+		protected MemberAccessor(TypeAccessor typeAccessor, MemberInfo memberInfo)
+		{
+			TypeAccessor = typeAccessor;
+			MemberInfo   = memberInfo;
+		}
+
+		#region Public Properties
+
+		public MemberInfo   MemberInfo   { get; private set; }
+		public TypeAccessor TypeAccessor { get; private set; }
+
+#if !SILVERLIGHT && !DATA
+
+		private PropertyDescriptor _propertyDescriptor;
+		public  PropertyDescriptor  PropertyDescriptor
+		{
+			get
+			{
+				if (_propertyDescriptor == null)
+					_propertyDescriptor = new MemberPropertyDescriptor(TypeAccessor.OriginalType, Name);
+
+				return _propertyDescriptor;
+			}
+		}
+
+#endif
+
+		public virtual bool HasGetter { get { return false; } }
+		public virtual bool HasSetter { get { return false; } }
+
+		public Type Type
+		{
+			get
+			{
+				return MemberInfo is PropertyInfo?
+					((PropertyInfo)MemberInfo).PropertyType:
+					((FieldInfo)   MemberInfo).FieldType;
+			}
+		}
+
+		public string Name
+		{
+			get { return MemberInfo.Name; }
+		}
+
+		private Type _underlyingType;
+		public  Type  UnderlyingType
+		{
+			get { return _underlyingType ?? (_underlyingType = TypeHelper.GetUnderlyingType(Type)); }
+		}
+
+		#endregion
+
+		#region Public Methods
+
+		public bool IsDefined<T>() where T : Attribute
+		{
+			return MemberInfo.IsDefined(typeof(T), true);
+		}
+
+		[Obsolete("Use generic version instead")]
+		public Attribute GetAttribute(Type attributeType)
+		{
+			var attrs = MemberInfo.GetCustomAttributes(attributeType, true);
+
+			return attrs.Length > 0? (Attribute)attrs[0]: null;
+		}
+
+		public T GetAttribute<T>() where T : Attribute
+		{
+			var attrs = MemberInfo.GetCustomAttributes(typeof(T), true);
+
+			return attrs.Length > 0? (T)attrs[0]: null;
+		}
+
+		[Obsolete("Use generic version instead")]
+		public object[] GetAttributes(Type attributeType)
+		{
+			var attrs = MemberInfo.GetCustomAttributes(attributeType, true);
+
+			return attrs.Length > 0? attrs: null;
+		}
+
+		public T[] GetAttributes<T>() where T : Attribute
+		{
+			Array attrs = MemberInfo.GetCustomAttributes(typeof(T), true);
+
+			return attrs.Length > 0? (T[])attrs: null;
+		}
+
+		public object[] GetAttributes()
+		{
+			var attrs = MemberInfo.GetCustomAttributes(true);
+
+			return attrs.Length > 0? attrs: null;
+		}
+
+		public object[] GetTypeAttributes(Type attributeType)
+		{
+			return TypeHelper.GetAttributes(TypeAccessor.OriginalType, attributeType);
+		}
+
+		#endregion
+
+		#region Set/Get Value
+
+		public virtual Boolean IsNull(object o)
+		{
+			return true;
+		}
+
+		static object GetDefaultValue<T>()
+		{
+			return default(T);
+		}
+
+		object _defaultValue;
+
+		public virtual object GetValue(object o)
+		{
+			if (_defaultValue == null && Type.IsValueType && !TypeHelper.IsNullableType(Type))
+			{
+				var mi = ReflectionHelper.Expressor<object>.MethodExpressor(_ => GetDefaultValue<int>());
+
+				_defaultValue =
+					Expression.Lambda<Func<object>>(
+						Expression.Call(mi.GetGenericMethodDefinition().MakeGenericMethod(Type)))
+					.Compile()();
+			}
+
+			return _defaultValue;
+		}
+
+		public virtual void SetValue(object o, object value)
+		{
+		}
+
+		public virtual void CloneValue(object source, object dest)
+		{
+			var value = GetValue(source);
+
+			SetValue(dest, value is ICloneable? ((ICloneable)value).Clone(): value);
+		}
+
+
+		// Simple types getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte    GetSByte   (object o) { return (SByte)   GetValue(o); }
+		public virtual Int16    GetInt16   (object o) { return (Int16)   GetValue(o); }
+		public virtual Int32    GetInt32   (object o) { return (Int32)   GetValue(o); }
+		public virtual Int64    GetInt64   (object o) { return (Int64)   GetValue(o); }
+
+		public virtual Byte     GetByte    (object o) { return (Byte)    GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt16   GetUInt16  (object o) { return (UInt16)  GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt32   GetUInt32  (object o) { return (UInt32)  GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt64   GetUInt64  (object o) { return (UInt64)  GetValue(o); }
+
+		public virtual Boolean  GetBoolean (object o) { return (Boolean) GetValue(o); }
+		public virtual Char     GetChar    (object o) { return (Char)    GetValue(o); }
+		public virtual Single   GetSingle  (object o) { return (Single)  GetValue(o); }
+		public virtual Double   GetDouble  (object o) { return (Double)  GetValue(o); }
+		public virtual Decimal  GetDecimal (object o) { return (Decimal) GetValue(o); }
+		public virtual Guid     GetGuid    (object o) { return (Guid)    GetValue(o); }
+		public virtual DateTime GetDateTime(object o) { return (DateTime)GetValue(o); }
+		public virtual TimeSpan GetTimeSpan(object o) { return (TimeSpan)GetValue(o); }
+		public virtual DateTimeOffset GetDateTimeOffset(object o) { return (DateTimeOffset)GetValue(o); }
+
+		// Nullable types getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte?    GetNullableSByte   (object o) { return (SByte?)   GetValue(o); }
+		public virtual Int16?    GetNullableInt16   (object o) { return (Int16?)   GetValue(o); }
+		public virtual Int32?    GetNullableInt32   (object o) { return (Int32?)   GetValue(o); }
+		public virtual Int64?    GetNullableInt64   (object o) { return (Int64?)   GetValue(o); }
+
+		public virtual Byte?     GetNullableByte    (object o) { return (Byte?)    GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt16?   GetNullableUInt16  (object o) { return (UInt16?)  GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt32?   GetNullableUInt32  (object o) { return (UInt32?)  GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt64?   GetNullableUInt64  (object o) { return (UInt64?)  GetValue(o); }
+
+		public virtual Boolean?  GetNullableBoolean (object o) { return (Boolean?) GetValue(o); }
+		public virtual Char?     GetNullableChar    (object o) { return (Char?)    GetValue(o); }
+		public virtual Single?   GetNullableSingle  (object o) { return (Single?)  GetValue(o); }
+		public virtual Double?   GetNullableDouble  (object o) { return (Double?)  GetValue(o); }
+		public virtual Decimal?  GetNullableDecimal (object o) { return (Decimal?) GetValue(o); }
+		public virtual Guid?     GetNullableGuid    (object o) { return (Guid?)    GetValue(o); }
+		public virtual DateTime? GetNullableDateTime(object o) { return (DateTime?)GetValue(o); }
+		public virtual TimeSpan? GetNullableTimeSpan(object o) { return (TimeSpan?)GetValue(o); }
+		public virtual DateTimeOffset? GetNullableDateTimeOffset(object o) { return (DateTimeOffset?)GetValue(o); }
+
+#if !SILVERLIGHT
+
+		// SQL type getters.
+		//
+		public virtual SqlByte     GetSqlByte    (object o) { return (SqlByte)    GetValue(o); }
+		public virtual SqlInt16    GetSqlInt16   (object o) { return (SqlInt16)   GetValue(o); }
+		public virtual SqlInt32    GetSqlInt32   (object o) { return (SqlInt32)   GetValue(o); }
+		public virtual SqlInt64    GetSqlInt64   (object o) { return (SqlInt64)   GetValue(o); }
+		public virtual SqlSingle   GetSqlSingle  (object o) { return (SqlSingle)  GetValue(o); }
+		public virtual SqlBoolean  GetSqlBoolean (object o) { return (SqlBoolean) GetValue(o); }
+		public virtual SqlDouble   GetSqlDouble  (object o) { return (SqlDouble)  GetValue(o); }
+		public virtual SqlDateTime GetSqlDateTime(object o) { return (SqlDateTime)GetValue(o); }
+		public virtual SqlDecimal  GetSqlDecimal (object o) { return (SqlDecimal) GetValue(o); }
+		public virtual SqlMoney    GetSqlMoney   (object o) { return (SqlMoney)   GetValue(o); }
+		public virtual SqlGuid     GetSqlGuid    (object o) { return (SqlGuid)    GetValue(o); }
+		public virtual SqlString   GetSqlString  (object o) { return (SqlString)  GetValue(o); }
+
+#endif
+
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void    SetSByte   (object o, SByte    value) { SetValue(o, value); }
+		public virtual void    SetInt16   (object o, Int16    value) { SetValue(o, value); }
+		public virtual void    SetInt32   (object o, Int32    value) { SetValue(o, value); }
+		public virtual void    SetInt64   (object o, Int64    value) { SetValue(o, value); }
+
+		public virtual void    SetByte    (object o, Byte     value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetUInt16  (object o, UInt16   value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetUInt32  (object o, UInt32   value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetUInt64  (object o, UInt64   value) { SetValue(o, value); }
+
+		public virtual void    SetBoolean (object o, Boolean  value) { SetValue(o, value); }
+		public virtual void    SetChar    (object o, Char     value) { SetValue(o, value); }
+		public virtual void    SetSingle  (object o, Single   value) { SetValue(o, value); }
+		public virtual void    SetDouble  (object o, Double   value) { SetValue(o, value); }
+		public virtual void    SetDecimal (object o, Decimal  value) { SetValue(o, value); }
+		public virtual void    SetGuid    (object o, Guid     value) { SetValue(o, value); }
+		public virtual void    SetDateTime(object o, DateTime value) { SetValue(o, value); }
+		public virtual void    SetTimeSpan(object o, TimeSpan value) { SetValue(o, value); }
+		public virtual void    SetDateTimeOffset(object o, DateTimeOffset value) { SetValue(o, value); }
+
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void    SetNullableSByte   (object o, SByte?    value) { SetValue(o, value); }
+		public virtual void    SetNullableInt16   (object o, Int16?    value) { SetValue(o, value); }
+		public virtual void    SetNullableInt32   (object o, Int32?    value) { SetValue(o, value); }
+		public virtual void    SetNullableInt64   (object o, Int64?    value) { SetValue(o, value); }
+
+		public virtual void    SetNullableByte    (object o, Byte?     value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetNullableUInt16  (object o, UInt16?   value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetNullableUInt32  (object o, UInt32?   value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetNullableUInt64  (object o, UInt64?   value) { SetValue(o, value); }
+
+		public virtual void    SetNullableBoolean (object o, Boolean?  value) { SetValue(o, value); }
+		public virtual void    SetNullableChar    (object o, Char?     value) { SetValue(o, value); }
+		public virtual void    SetNullableSingle  (object o, Single?   value) { SetValue(o, value); }
+		public virtual void    SetNullableDouble  (object o, Double?   value) { SetValue(o, value); }
+		public virtual void    SetNullableDecimal (object o, Decimal?  value) { SetValue(o, value); }
+		public virtual void    SetNullableGuid    (object o, Guid?     value) { SetValue(o, value); }
+		public virtual void    SetNullableDateTime(object o, DateTime? value) { SetValue(o, value); }
+		public virtual void    SetNullableTimeSpan(object o, TimeSpan? value) { SetValue(o, value); }
+		public virtual void    SetNullableDateTimeOffset(object o, DateTimeOffset? value) { SetValue(o, value); }
+
+#if !SILVERLIGHT
+
+		// SQL type setters.
+		//
+		public virtual void SetSqlByte    (object o, SqlByte     value) { SetValue(o, value); }
+		public virtual void SetSqlInt16   (object o, SqlInt16    value) { SetValue(o, value); }
+		public virtual void SetSqlInt32   (object o, SqlInt32    value) { SetValue(o, value); }
+		public virtual void SetSqlInt64   (object o, SqlInt64    value) { SetValue(o, value); }
+		public virtual void SetSqlSingle  (object o, SqlSingle   value) { SetValue(o, value); }
+		public virtual void SetSqlBoolean (object o, SqlBoolean  value) { SetValue(o, value); }
+		public virtual void SetSqlDouble  (object o, SqlDouble   value) { SetValue(o, value); }
+		public virtual void SetSqlDateTime(object o, SqlDateTime value) { SetValue(o, value); }
+		public virtual void SetSqlDecimal (object o, SqlDecimal  value) { SetValue(o, value); }
+		public virtual void SetSqlMoney   (object o, SqlMoney    value) { SetValue(o, value); }
+		public virtual void SetSqlGuid    (object o, SqlGuid     value) { SetValue(o, value); }
+		public virtual void SetSqlString  (object o, SqlString   value) { SetValue(o, value); }
+
+#endif
+
+		#endregion
+	}
+}