using System; using System.Data.SqlTypes; using BLToolkit.Reflection; namespace BLToolkit.Mapping { [CLSCompliant(false)] public static class MapGetData { public abstract class MB { public abstract V From(IMapDataSource s, object o, int i); } public static T From(IMapDataSource s, object o, int i) { return I.From(s, o, i); } public static MB I = GetGetter(); private static MB GetGetter() { Type t = typeof(T); // Scalar Types. // if (t == typeof(SByte)) return (MB)(object)(new I8()); if (t == typeof(Int16)) return (MB)(object)(new I16()); if (t == typeof(Int32)) return (MB)(object)(new I32()); if (t == typeof(Int64)) return (MB)(object)(new I64()); if (t == typeof(Byte)) return (MB)(object)(new U8()); if (t == typeof(UInt16)) return (MB)(object)(new U16()); if (t == typeof(UInt32)) return (MB)(object)(new U32()); if (t == typeof(UInt64)) return (MB)(object)(new U64()); if (t == typeof(Single)) return (MB)(object)(new R4()); if (t == typeof(Double)) return (MB)(object)(new R8()); if (t == typeof(Boolean)) return (MB)(object)(new B()); if (t == typeof(Decimal)) return (MB)(object)(new D()); if (t == typeof(Char)) return (MB)(object)(new C()); if (t == typeof(Guid)) return (MB)(object)(new G()); if (t == typeof(DateTime)) return (MB)(object)(new DT()); #if FW3 if (t == typeof(DateTimeOffset)) return (MB)(object)(new DTO()); #endif // Enums. // if (t.IsEnum) { t = Enum.GetUnderlyingType(t); if (t == typeof(SByte)) return new EI8(); if (t == typeof(Int16)) return new EI16(); if (t == typeof(Int32)) return new EI32(); if (t == typeof(Int64)) return new EI64(); if (t == typeof(Byte)) return new EU8(); if (t == typeof(UInt16)) return new EU16(); if (t == typeof(UInt32)) return new EU32(); if (t == typeof(UInt64)) return new EU64(); } // Nullable Types. // if (t == typeof(SByte?)) return (MB)(object)(new NI8()); if (t == typeof(Int16?)) return (MB)(object)(new NI16()); if (t == typeof(Int32?)) return (MB)(object)(new NI32()); if (t == typeof(Int64?)) return (MB)(object)(new NI64()); if (t == typeof(Byte?)) return (MB)(object)(new NU8()); if (t == typeof(UInt16?)) return (MB)(object)(new NU16()); if (t == typeof(UInt32?)) return (MB)(object)(new NU32()); if (t == typeof(UInt64?)) return (MB)(object)(new NU64()); if (t == typeof(Single?)) return (MB)(object)(new NR4()); if (t == typeof(Double?)) return (MB)(object)(new NR8()); if (t == typeof(Boolean?)) return (MB)(object)(new NB()); if (t == typeof(Decimal?)) return (MB)(object)(new ND()); if (t == typeof(Char?)) return (MB)(object)(new NC()); if (t == typeof(Guid?)) return (MB)(object)(new NG()); if (t == typeof(DateTime?)) return (MB)(object)(new NDT()); #if FW3 if (t == typeof(DateTimeOffset?)) return (MB)(object)(new NDTO()); #endif // Nullable Enums. // if (TypeHelper.IsNullable(t) && Nullable.GetUnderlyingType(t).IsEnum) { Type enumType = Nullable.GetUnderlyingType(t); t = Enum.GetUnderlyingType(enumType); if (t == typeof(SByte)) return (MB)Activator.CreateInstance(typeof(NEI8<>).MakeGenericType(typeof(T), enumType)); if (t == typeof(Int16)) return (MB)Activator.CreateInstance(typeof(NEI16<>).MakeGenericType(typeof(T), enumType)); if (t == typeof(Int32)) return (MB)Activator.CreateInstance(typeof(NEI32<>).MakeGenericType(typeof(T), enumType)); if (t == typeof(Int64)) return (MB)Activator.CreateInstance(typeof(NEI64<>).MakeGenericType(typeof(T), enumType)); if (t == typeof(Byte)) return (MB)Activator.CreateInstance(typeof(NEU8<>).MakeGenericType(typeof(T), enumType)); if (t == typeof(UInt16)) return (MB)Activator.CreateInstance(typeof(NEU16<>).MakeGenericType(typeof(T), enumType)); if (t == typeof(UInt32)) return (MB)Activator.CreateInstance(typeof(NEU32<>).MakeGenericType(typeof(T), enumType)); if (t == typeof(UInt64)) return (MB)Activator.CreateInstance(typeof(NEU64<>).MakeGenericType(typeof(T), enumType)); } // SqlTypes. // if (t == typeof(SqlString)) return (MB)(object)(new dbS()); if (t == typeof(SqlByte)) return (MB)(object)(new dbU8()); if (t == typeof(SqlInt16)) return (MB)(object)(new dbI16()); if (t == typeof(SqlInt32)) return (MB)(object)(new dbI32()); if (t == typeof(SqlInt64)) return (MB)(object)(new dbI64()); if (t == typeof(SqlSingle)) return (MB)(object)(new dbR4()); if (t == typeof(SqlDouble)) return (MB)(object)(new dbR8()); if (t == typeof(SqlDecimal)) return (MB)(object)(new dbD()); if (t == typeof(SqlMoney)) return (MB)(object)(new dbM()); if (t == typeof(SqlBoolean)) return (MB)(object)(new dbB()); if (t == typeof(SqlGuid)) return (MB)(object)(new dbG()); if (t == typeof(SqlDateTime)) return (MB)(object)(new dbDT()); return new Default(); } // Default setter. // public sealed class Default : MB { public override V From(IMapDataSource s, object o, int i) { return (V)s.GetValue (o, i); } } // Scalar Types. // sealed class I8 : MB { public override SByte From(IMapDataSource s, object o, int i) { return s.GetSByte (o, i); } } sealed class I16 : MB { public override Int16 From(IMapDataSource s, object o, int i) { return s.GetInt16 (o, i); } } sealed class I32 : MB { public override Int32 From(IMapDataSource s, object o, int i) { return s.GetInt32 (o, i); } } sealed class I64 : MB { public override Int64 From(IMapDataSource s, object o, int i) { return s.GetInt64 (o, i); } } sealed class U8 : MB { public override Byte From(IMapDataSource s, object o, int i) { return s.GetByte (o, i); } } sealed class U16 : MB { public override UInt16 From(IMapDataSource s, object o, int i) { return s.GetUInt16 (o, i); } } sealed class U32 : MB { public override UInt32 From(IMapDataSource s, object o, int i) { return s.GetUInt32 (o, i); } } sealed class U64 : MB { public override UInt64 From(IMapDataSource s, object o, int i) { return s.GetUInt64 (o, i); } } sealed class R4 : MB { public override Single From(IMapDataSource s, object o, int i) { return s.GetSingle (o, i); } } sealed class R8 : MB { public override Double From(IMapDataSource s, object o, int i) { return s.GetDouble (o, i); } } sealed class B : MB { public override Boolean From(IMapDataSource s, object o, int i) { return s.GetBoolean (o, i); } } sealed class D : MB { public override Decimal From(IMapDataSource s, object o, int i) { return s.GetDecimal (o, i); } } sealed class C : MB { public override Char From(IMapDataSource s, object o, int i) { return s.GetChar (o, i); } } sealed class G : MB { public override Guid From(IMapDataSource s, object o, int i) { return s.GetGuid (o, i); } } sealed class DT : MB { public override DateTime From(IMapDataSource s, object o, int i) { return s.GetDateTime (o, i); } } #if FW3 sealed class DTO : MB { public override DateTimeOffset From(IMapDataSource s, object o, int i) { return s.GetDateTimeOffset (o, i); } } #endif // Enums. // sealed class EI8 : MB { public override E From(IMapDataSource s, object o, int i) { return (E)(object)s.GetSByte (o, i); } } sealed class EI16 : MB { public override E From(IMapDataSource s, object o, int i) { return (E)(object)s.GetInt16 (o, i); } } sealed class EI32 : MB { public override E From(IMapDataSource s, object o, int i) { return (E)(object)s.GetInt32 (o, i); } } sealed class EI64 : MB { public override E From(IMapDataSource s, object o, int i) { return (E)(object)s.GetInt64 (o, i); } } sealed class EU8 : MB { public override E From(IMapDataSource s, object o, int i) { return (E)(object)s.GetByte (o, i); } } sealed class EU16 : MB { public override E From(IMapDataSource s, object o, int i) { return (E)(object)s.GetUInt16 (o, i); } } sealed class EU32 : MB { public override E From(IMapDataSource s, object o, int i) { return (E)(object)s.GetUInt32 (o, i); } } sealed class EU64 : MB { public override E From(IMapDataSource s, object o, int i) { return (E)(object)s.GetUInt64 (o, i); } } // Nullable Types. // sealed class NI8 : MB { public override SByte? From(IMapDataSource s, object o, int i) { return s.GetNullableSByte (o, i); } } sealed class NI16 : MB { public override Int16? From(IMapDataSource s, object o, int i) { return s.GetNullableInt16 (o, i); } } sealed class NI32 : MB { public override Int32? From(IMapDataSource s, object o, int i) { return s.GetNullableInt32 (o, i); } } sealed class NI64 : MB { public override Int64? From(IMapDataSource s, object o, int i) { return s.GetNullableInt64 (o, i); } } sealed class NU8 : MB { public override Byte? From(IMapDataSource s, object o, int i) { return s.GetNullableByte (o, i); } } sealed class NU16 : MB { public override UInt16? From(IMapDataSource s, object o, int i) { return s.GetNullableUInt16 (o, i); } } sealed class NU32 : MB { public override UInt32? From(IMapDataSource s, object o, int i) { return s.GetNullableUInt32 (o, i); } } sealed class NU64 : MB { public override UInt64? From(IMapDataSource s, object o, int i) { return s.GetNullableUInt64 (o, i); } } sealed class NR4 : MB { public override Single? From(IMapDataSource s, object o, int i) { return s.GetNullableSingle (o, i); } } sealed class NR8 : MB { public override Double? From(IMapDataSource s, object o, int i) { return s.GetNullableDouble (o, i); } } sealed class NB : MB { public override Boolean? From(IMapDataSource s, object o, int i) { return s.GetNullableBoolean (o, i); } } sealed class ND : MB { public override Decimal? From(IMapDataSource s, object o, int i) { return s.GetNullableDecimal (o, i); } } sealed class NC : MB { public override Char? From(IMapDataSource s, object o, int i) { return s.GetNullableChar (o, i); } } sealed class NG : MB { public override Guid? From(IMapDataSource s, object o, int i) { return s.GetNullableGuid (o, i); } } sealed class NDT : MB { public override DateTime? From(IMapDataSource s, object o, int i) { return s.GetNullableDateTime (o, i); } } #if FW3 sealed class NDTO : MB { public override DateTimeOffset? From(IMapDataSource s, object o, int i) { return s.GetNullableDateTimeOffset (o, i); } } #endif // Nullable Enums. // sealed class NEI8 : MB where E : struct { public override E? From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetSByte (o, i); } } sealed class NEI16 : MB where E : struct { public override E? From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetInt16 (o, i); } } sealed class NEI32 : MB where E : struct { public override E? From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetInt32 (o, i); } } sealed class NEI64 : MB where E : struct { public override E? From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetInt64 (o, i); } } sealed class NEU8 : MB where E : struct { public override E? From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetByte (o, i); } } sealed class NEU16 : MB where E : struct { public override E? From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetUInt16(o, i); } } sealed class NEU32 : MB where E : struct { public override E? From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetUInt32(o, i); } } sealed class NEU64 : MB where E : struct { public override E? From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetUInt64(o, i); } } // SqlTypes. // sealed class dbS : MB { public override SqlString From(IMapDataSource s, object o, int i) { return s.GetSqlString (o, i); } } sealed class dbU8 : MB { public override SqlByte From(IMapDataSource s, object o, int i) { return s.GetSqlByte (o, i); } } sealed class dbI16 : MB { public override SqlInt16 From(IMapDataSource s, object o, int i) { return s.GetSqlInt16 (o, i); } } sealed class dbI32 : MB { public override SqlInt32 From(IMapDataSource s, object o, int i) { return s.GetSqlInt32 (o, i); } } sealed class dbI64 : MB { public override SqlInt64 From(IMapDataSource s, object o, int i) { return s.GetSqlInt64 (o, i); } } sealed class dbR4 : MB { public override SqlSingle From(IMapDataSource s, object o, int i) { return s.GetSqlSingle (o, i); } } sealed class dbR8 : MB { public override SqlDouble From(IMapDataSource s, object o, int i) { return s.GetSqlDouble (o, i); } } sealed class dbD : MB { public override SqlDecimal From(IMapDataSource s, object o, int i) { return s.GetSqlDecimal (o, i); } } sealed class dbM : MB { public override SqlMoney From(IMapDataSource s, object o, int i) { return s.GetSqlMoney (o, i); } } sealed class dbB : MB { public override SqlBoolean From(IMapDataSource s, object o, int i) { return s.GetSqlBoolean (o, i); } } sealed class dbG : MB { public override SqlGuid From(IMapDataSource s, object o, int i) { return s.GetSqlGuid (o, i); } } sealed class dbDT : MB { public override SqlDateTime From(IMapDataSource s, object o, int i) { return s.GetSqlDateTime (o, i); } } } }