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

  Source.Reflection.ExprMemberAccessor.cs

 
using System;
using System.Data.SqlTypes;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;

namespace BLToolkit.Reflection
{
    using Common;
    using Emit;

    public abstract class ExprMemberAccessor : MemberAccessor
    {
        protected ExprMemberAccessor(TypeAccessor typeAccessor, MemberInfo memberInfo)
            : base(typeAccessor, memberInfo)
        {
        }

        #region Public Properties

        protected bool HasSetterValue; 
        public override bool HasGetter { get { return true;           } }
        public override bool HasSetter { get { return HasSetterValue; } }

        #endregion

        static public MemberAccessor GetMemberAccessor(TypeAccessor typeAccessor, string memberName)
        {
            var par  = Expression.Parameter(typeof(object), "obj");
            var expr = Expression.PropertyOrField(Expression.Convert(par, typeAccessor.Type), memberName);

            var type = expr.Type;

            var underlyingType = type;
            var isNullable     = false;

            if (underlyingType.IsGenericType && underlyingType.GetGenericTypeDefinition() == typeof(Nullable<>))
            {
                underlyingType = underlyingType.GetGenericArguments()[0];
                isNullable     = true;
            }

            if (underlyingType.IsEnum)
                underlyingType = Enum.GetUnderlyingType(underlyingType);

            if (isNullable)
            {
                switch (Type.GetTypeCode(underlyingType))
                {
                    case TypeCode.Boolean  : return new NullableBooleanAccessor (typeAccessor, par, expr);
                    case TypeCode.Char     : return new NullableCharAccessor    (typeAccessor, par, expr);
                    case TypeCode.SByte    : return new NullableSByteAccessor   (typeAccessor, par, expr);
                    case TypeCode.Byte     : return new NullableByteAccessor    (typeAccessor, par, expr);
                    case TypeCode.Int16    : return new NullableInt16Accessor   (typeAccessor, par, expr);
                    case TypeCode.UInt16   : return new NullableUInt16Accessor  (typeAccessor, par, expr);
                    case TypeCode.Int32    : return new NullableInt32Accessor   (typeAccessor, par, expr);
                    case TypeCode.UInt32   : return new NullableUInt32Accessor  (typeAccessor, par, expr);
                    case TypeCode.Int64    : return new NullableInt64Accessor   (typeAccessor, par, expr);
                    case TypeCode.UInt64   : return new NullableUInt64Accessor  (typeAccessor, par, expr);
                    case TypeCode.Single   : return new NullableSingleAccessor  (typeAccessor, par, expr);
                    case TypeCode.Double   : return new NullableDoubleAccessor  (typeAccessor, par, expr);
                    case TypeCode.Decimal  : return new NullableDecimalAccessor (typeAccessor, par, expr);
                    case TypeCode.DateTime : return new NullableDateTimeAccessor(typeAccessor, par, expr);
                    case TypeCode.Object   :
                        if (type == typeof(Guid))           return new NullableGuidAccessor          (typeAccessor, par, expr);
                        if (type == typeof(DateTimeOffset)) return new NullableDateTimeOffsetAccessor(typeAccessor, par, expr);
                        if (type == typeof(TimeSpan))       return new NullableTimeSpanAccessor      (typeAccessor, par, expr);
                        break;
                    default                : break;
                }
            }
            else
            {
                switch (Type.GetTypeCode(underlyingType))
                {
                    case TypeCode.Boolean  : return new BooleanAccessor (typeAccessor, par, expr);
                    case TypeCode.Char     : return new CharAccessor    (typeAccessor, par, expr);
                    case TypeCode.SByte    : return new SByteAccessor   (typeAccessor, par, expr);
                    case TypeCode.Byte     : return new ByteAccessor    (typeAccessor, par, expr);
                    case TypeCode.Int16    : return new Int16Accessor   (typeAccessor, par, expr);
                    case TypeCode.UInt16   : return new UInt16Accessor  (typeAccessor, par, expr);
                    case TypeCode.Int32    : return new Int32Accessor   (typeAccessor, par, expr);
                    case TypeCode.UInt32   : return new UInt32Accessor  (typeAccessor, par, expr);
                    case TypeCode.Int64    : return new Int64Accessor   (typeAccessor, par, expr);
                    case TypeCode.UInt64   : return new UInt64Accessor  (typeAccessor, par, expr);
                    case TypeCode.Single   : return new SingleAccessor  (typeAccessor, par, expr);
                    case TypeCode.Double   : return new DoubleAccessor  (typeAccessor, par, expr);
                    case TypeCode.Decimal  : return new DecimalAccessor (typeAccessor, par, expr);
                    case TypeCode.DateTime : return new DateTimeAccessor(typeAccessor, par, expr);
                    case TypeCode.Object   :
                        if (type == typeof(Guid))           return new GuidAccessor          (typeAccessor, par, expr);
                        if (type == typeof(DateTimeOffset)) return new DateTimeOffsetAccessor(typeAccessor, par, expr);
                        if (type == typeof(TimeSpan))       return new TimeSpanAccessor      (typeAccessor, par, expr);
                        break;
                    default                : break;
                }
            }

            if (type == typeof(SqlByte))     return new SqlByteAccessor    (typeAccessor, par, expr);
            if (type == typeof(SqlInt16))    return new SqlInt16Accessor   (typeAccessor, par, expr);
            if (type == typeof(SqlInt32))    return new SqlInt32Accessor   (typeAccessor, par, expr);
            if (type == typeof(SqlInt64))    return new SqlInt64Accessor   (typeAccessor, par, expr);
            if (type == typeof(SqlSingle))   return new SqlSingleAccessor  (typeAccessor, par, expr);
            if (type == typeof(SqlBoolean))  return new SqlBooleanAccessor (typeAccessor, par, expr);
            if (type == typeof(SqlDouble))   return new SqlDoubleAccessor  (typeAccessor, par, expr);
            if (type == typeof(SqlDateTime)) return new SqlDateTimeAccessor(typeAccessor, par, expr);
            if (type == typeof(SqlDecimal))  return new SqlDecimalAccessor (typeAccessor, par, expr);
            if (type == typeof(SqlMoney))    return new SqlMoneyAccessor   (typeAccessor, par, expr);
            if (type == typeof(SqlString))   return new SqlStringAccessor  (typeAccessor, par, expr);
            if (type == typeof(SqlGuid))     return new SqlGuidAccessor    (typeAccessor, par, expr);

            return (MemberAccessor)Activator.CreateInstance(
                typeof(BaseAccessor<>).MakeGenericType(type),
                new object[] { typeAccessor, par, expr });
        }

        class BaseAccessor<T> : ExprMemberAccessor
        {
            protected readonly Func  <object,T> Getter;
            protected readonly Action<object,T> Setter;

            static int _counter;

            public BaseAccessor(TypeAccessor typeAccessor, ParameterExpression par, MemberExpression expr)
                : base(typeAccessor, expr.Member)
            {
                Getter = Expression.Lambda<Func<object,T>>(expr, par).Compile();

                var mi = expr.Member;

                HasSetterValue = !(mi is PropertyInfo) || ((PropertyInfo)mi).GetSetMethod() != null;

                if (HasSetterValue)
                {
                    var dm   = new DynamicMethod(
                        "setter_" + mi.Name + "_" + ++_counter,
                        typeof(void),
                        new[] { typeof(object), typeof(T) },
                        typeAccessor.Type);
                    var emit = new EmitHelper(dm.GetILGenerator());

                    emit
                        .ldarg_0
                        .castType (typeAccessor.Type)
                        .ldarg_1
                        .end();

                    if (mi is FieldInfo) emit.stfld   ((FieldInfo)mi);
                    else                 emit.callvirt(((PropertyInfo)mi).GetSetMethod());

                    emit.ret();

                    Setter = (Action<object,T>)dm.CreateDelegate(typeof(Action<object,T>));
                }
            }

            public override object GetValue(object obj)
            {
                return Getter(obj);
            }

            public override void SetValue(object obj, object value)
            {
                Setter(obj, ConvertTo<T>.From(value));
            }
        }

        class NullableAccessor<T> : BaseAccessor<T?>
            where T : struct
        {
            public NullableAccessor(TypeAccessor typeAccessor, ParameterExpression par, MemberExpression member)
                : base(typeAccessor, par, member)
            {
            }

            public override bool IsNull(object obj)
            {
                return Getter(obj) == null;
            }
        }

        #region Basic Types

        class BooleanAccessor : BaseAccessor<Boolean>
        {
            public BooleanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Boolean GetBoolean(object obj)                { return Getter(obj); }
            public override void    SetBoolean(object obj, Boolean value) { Setter(obj, value); }
        }

        class CharAccessor : BaseAccessor<Char>
        {
            public CharAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Char GetChar(object obj)             { return Getter(obj); }
            public override void SetChar(object obj, Char value) { Setter(obj, value); }
        }

        class SByteAccessor : BaseAccessor<SByte>
        {
            public SByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SByte GetSByte(object obj)              { return Getter(obj); }
            public override void  SetSByte(object obj, SByte value) { Setter(obj, value); }
        }

        class ByteAccessor : BaseAccessor<Byte>
        {
            public ByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Byte GetByte(object obj)             { return Getter(obj); }
            public override void SetByte(object obj, Byte value) { Setter(obj, value); }
        }

        class Int16Accessor : BaseAccessor<Int16>
        {
            public Int16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Int16 GetInt16(object obj)              { return Getter(obj); }
            public override void  SetInt16(object obj, Int16 value) { Setter(obj, value); }
        }

        class UInt16Accessor : BaseAccessor<UInt16>
        {
            public UInt16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override UInt16 GetUInt16(object obj)               { return Getter(obj); }
            public override void   SetUInt16(object obj, UInt16 value) { Setter(obj, value); }
        }

        class Int32Accessor : BaseAccessor<Int32>
        {
            public Int32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Int32 GetInt32(object obj)              { return Getter(obj); }
            public override void  SetInt32(object obj, Int32 value) { Setter(obj, value); }
        }

        class UInt32Accessor : BaseAccessor<UInt32>
        {
            public UInt32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override UInt32 GetUInt32(object obj)               { return Getter(obj); }
            public override void   SetUInt32(object obj, UInt32 value) { Setter(obj, value); }
        }

        class Int64Accessor : BaseAccessor<Int64>
        {
            public Int64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Int64 GetInt64(object obj)              { return Getter(obj); }
            public override void  SetInt64(object obj, Int64 value) { Setter(obj, value); }
        }

        class UInt64Accessor : BaseAccessor<UInt64>
        {
            public UInt64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override UInt64 GetUInt64(object obj)               { return Getter(obj); }
            public override void   SetUInt64(object obj, UInt64 value) { Setter(obj, value); }
        }

        class SingleAccessor : BaseAccessor<Single>
        {
            public SingleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Single GetSingle(object obj)               { return Getter(obj); }
            public override void   SetSingle(object obj, Single value) { Setter(obj, value); }
        }

        class DoubleAccessor : BaseAccessor<Double>
        {
            public DoubleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Double GetDouble(object obj)               { return Getter(obj); }
            public override void   SetDouble(object obj, Double value) { Setter(obj, value); }
        }

        class DecimalAccessor : BaseAccessor<Decimal>
        {
            public DecimalAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Decimal GetDecimal(object obj)                { return Getter(obj); }
            public override void    SetDecimal(object obj, Decimal value) { Setter(obj, value); }
        }

        class DateTimeAccessor : BaseAccessor<DateTime>
        {
            public DateTimeAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override DateTime GetDateTime(object obj)                 { return Getter(obj); }
            public override void     SetDateTime(object obj, DateTime value) { Setter(obj, value); }
        }

        class GuidAccessor : BaseAccessor<Guid>
        {
            public GuidAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Guid GetGuid(object obj)             { return Getter(obj); }
            public override void SetGuid(object obj, Guid value) { Setter(obj, value); }
        }

        class DateTimeOffsetAccessor : BaseAccessor<DateTimeOffset>
        {
            public DateTimeOffsetAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override DateTimeOffset GetDateTimeOffset(object obj)                       { return Getter(obj); }
            public override void           SetDateTimeOffset(object obj, DateTimeOffset value) { Setter(obj, value); }
        }

        class TimeSpanAccessor : BaseAccessor<TimeSpan>
        {
            public TimeSpanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override TimeSpan GetTimeSpan(object obj)                 { return Getter(obj); }
            public override void     SetTimeSpan(object obj, TimeSpan value) { Setter(obj, value); }
        }

        #endregion

        #region Nullable

        class NullableBooleanAccessor : NullableAccessor<Boolean>
        {
            public NullableBooleanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Boolean? GetNullableBoolean(object obj)                 { return Getter(obj); }
            public override void     SetNullableBoolean(object obj, Boolean? value) { Setter(obj, value); }
        }

        class NullableCharAccessor : NullableAccessor<Char>
        {
            public NullableCharAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Char? GetNullableChar(object obj)              { return Getter(obj); }
            public override void  SetNullableChar(object obj, Char? value) { Setter(obj, value); }
        }

        class NullableSByteAccessor : NullableAccessor<SByte>
        {
            public NullableSByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SByte? GetNullableSByte(object obj)               { return Getter(obj); }
            public override void   SetNullableSByte(object obj, SByte? value) { Setter(obj, value); }
        }

        class NullableByteAccessor : NullableAccessor<Byte>
        {
            public NullableByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Byte? GetNullableByte(object obj)              { return Getter(obj); }
            public override void  SetNullableByte(object obj, Byte? value) { Setter(obj, value); }
        }

        class NullableInt16Accessor : NullableAccessor<Int16>
        {
            public NullableInt16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Int16? GetNullableInt16(object obj)               { return Getter(obj); }
            public override void   SetNullableInt16(object obj, Int16? value) { Setter(obj, value); }
        }

        class NullableUInt16Accessor : NullableAccessor<UInt16>
        {
            public NullableUInt16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override UInt16? GetNullableUInt16(object obj)                { return Getter(obj); }
            public override void    SetNullableUInt16(object obj, UInt16? value) { Setter(obj, value); }
        }

        class NullableInt32Accessor : NullableAccessor<Int32>
        {
            public NullableInt32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Int32? GetNullableInt32(object obj)               { return Getter(obj); }
            public override void   SetNullableInt32(object obj, Int32? value) { Setter(obj, value); }
        }

        class NullableUInt32Accessor : NullableAccessor<UInt32>
        {
            public NullableUInt32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override UInt32? GetNullableUInt32(object obj)                { return Getter(obj); }
            public override void    SetNullableUInt32(object obj, UInt32? value) { Setter(obj, value); }
        }

        class NullableInt64Accessor : NullableAccessor<Int64>
        {
            public NullableInt64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Int64? GetNullableInt64(object obj)               { return Getter(obj); }
            public override void   SetNullableInt64(object obj, Int64? value) { Setter(obj, value); }
        }

        class NullableUInt64Accessor : NullableAccessor<UInt64>
        {
            public NullableUInt64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override UInt64? GetNullableUInt64(object obj)                { return Getter(obj); }
            public override void    SetNullableUInt64(object obj, UInt64? value) { Setter(obj, value); }
        }

        class NullableSingleAccessor : NullableAccessor<Single>
        {
            public NullableSingleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Single? GetNullableSingle(object obj)                { return Getter(obj); }
            public override void    SetNullableSingle(object obj, Single? value) { Setter(obj, value); }
        }

        class NullableDoubleAccessor : NullableAccessor<Double>
        {
            public NullableDoubleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Double? GetNullableDouble(object obj)                { return Getter(obj); }
            public override void    SetNullableDouble(object obj, Double? value) { Setter(obj, value); }
        }

        class NullableDecimalAccessor : NullableAccessor<Decimal>
        {
            public NullableDecimalAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Decimal? GetNullableDecimal(object obj)                 { return Getter(obj); }
            public override void     SetNullableDecimal(object obj, Decimal? value) { Setter(obj, value); }
        }

        class NullableDateTimeAccessor : NullableAccessor<DateTime>
        {
            public NullableDateTimeAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override DateTime? GetNullableDateTime(object obj)                  { return Getter(obj); }
            public override void      SetNullableDateTime(object obj, DateTime? value) { Setter(obj, value); }
        }

        class NullableGuidAccessor : NullableAccessor<Guid>
        {
            public NullableGuidAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override Guid? GetNullableGuid(object obj)              { return Getter(obj); }
            public override void  SetNullableGuid(object obj, Guid? value) { Setter(obj, value); }
        }

        class NullableDateTimeOffsetAccessor : NullableAccessor<DateTimeOffset>
        {
            public NullableDateTimeOffsetAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override DateTimeOffset? GetNullableDateTimeOffset(object obj)                        { return Getter(obj); }
            public override void            SetNullableDateTimeOffset(object obj, DateTimeOffset? value) { Setter(obj, value); }
        }

        class NullableTimeSpanAccessor : NullableAccessor<TimeSpan>
        {
            public NullableTimeSpanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override TimeSpan? GetNullableTimeSpan(object obj)                  { return Getter(obj); }
            public override void      SetNullableTimeSpan(object obj, TimeSpan? value) { Setter(obj, value); }
        }

        #endregion

        #region Sql Types

        class SqlByteAccessor : BaseAccessor<SqlByte>
        {
            public SqlByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlByte GetSqlByte(object obj)                { return Getter(obj); }
            public override void    SetSqlByte(object obj, SqlByte value) { Setter(obj, value); }
        }

        class SqlInt16Accessor : BaseAccessor<SqlInt16>
        {
            public SqlInt16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlInt16 GetSqlInt16(object obj)                 { return Getter(obj); }
            public override void     SetSqlInt16(object obj, SqlInt16 value) { Setter(obj, value); }
        }

        class SqlInt32Accessor : BaseAccessor<SqlInt32>
        {
            public SqlInt32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlInt32 GetSqlInt32(object obj)                 { return Getter(obj); }
            public override void     SetSqlInt32(object obj, SqlInt32 value) { Setter(obj, value); }
        }

        class SqlInt64Accessor : BaseAccessor<SqlInt64>
        {
            public SqlInt64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlInt64 GetSqlInt64(object obj)                 { return Getter(obj); }
            public override void     SetSqlInt64(object obj, SqlInt64 value) { Setter(obj, value); }
        }

        class SqlSingleAccessor : BaseAccessor<SqlSingle>
        {
            public SqlSingleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlSingle GetSqlSingle(object obj)                  { return Getter(obj); }
            public override void      SetSqlSingle(object obj, SqlSingle value) { Setter(obj, value); }
        }

        class SqlBooleanAccessor : BaseAccessor<SqlBoolean>
        {
            public SqlBooleanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlBoolean GetSqlBoolean(object obj)                   { return Getter(obj); }
            public override void       SetSqlBoolean(object obj, SqlBoolean value) { Setter(obj, value); }
        }

        class SqlDoubleAccessor : BaseAccessor<SqlDouble>
        {
            public SqlDoubleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlDouble GetSqlDouble(object obj)                  { return Getter(obj); }
            public override void      SetSqlDouble(object obj, SqlDouble value) { Setter(obj, value); }
        }

        class SqlDateTimeAccessor : BaseAccessor<SqlDateTime>
        {
            public SqlDateTimeAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlDateTime GetSqlDateTime(object obj)                    { return Getter(obj); }
            public override void        SetSqlDateTime(object obj, SqlDateTime value) { Setter(obj, value); }
        }

        class SqlDecimalAccessor : BaseAccessor<SqlDecimal>
        {
            public SqlDecimalAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlDecimal GetSqlDecimal(object obj)                   { return Getter(obj); }
            public override void       SetSqlDecimal(object obj, SqlDecimal value) { Setter(obj, value); }
        }

        class SqlMoneyAccessor : BaseAccessor<SqlMoney>
        {
            public SqlMoneyAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlMoney GetSqlMoney(object obj)                 { return Getter(obj); }
            public override void     SetSqlMoney(object obj, SqlMoney value) { Setter(obj, value); }
        }

        class SqlStringAccessor : BaseAccessor<SqlString>
        {
            public SqlStringAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlString GetSqlString(object obj)                  { return Getter(obj); }
            public override void      SetSqlString(object obj, SqlString value) { Setter(obj, value); }
        }

        class SqlGuidAccessor : BaseAccessor<SqlGuid>
        {
            public SqlGuidAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
                : base(accessor, expression, expr)
            {
            }

            public override SqlGuid GetSqlGuid(object obj)                 { return Getter(obj); }
            public override void     SetSqlGuid(object obj, SqlGuid value) { Setter(obj, value); }
        }

        #endregion
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net