Mercurial > pub > bltoolkit
diff Source/Reflection/ExprMemberAccessor.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/ExprMemberAccessor.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,717 @@ +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 !SILVERLIGHT + + 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); + +#endif + + 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) + { + Expression ex = expr; + + if (TypeHelper.IsEnumOrNullableEnum(ex.Type) && ex.Type != typeof(T)) + ex = Expression.Convert(ex, typeof(T)); + + Getter = Expression.Lambda<Func<object,T>>(ex, par).Compile(); + + var mi = expr.Member; + + HasSetterValue = !(mi is PropertyInfo) || ((PropertyInfo)mi).GetSetMethod(true) != 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(true)); + + emit.ret(); + + Setter = (Action<object,T>)dm.CreateDelegate(typeof(Action<object,T>)); + } + else + { + Setter = (_,__) => {}; + } + } + + 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 + +#if !SILVERLIGHT + + 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); } + } + +#endif + + #endregion + } +}