Mercurial > pub > bltoolkit
diff Tools/CodeGenerator/ValueMapping.Declare.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/Tools/CodeGenerator/ValueMapping.Declare.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,255 @@ +using System; +using System.Data.SqlTypes; + +using KeyValue = System.Collections.Generic.KeyValuePair<System.Type, System.Type>; +using Table = System.Collections.Generic.Dictionary<System.Collections.Generic.KeyValuePair<System.Type, System.Type>, BLToolkit.Mapping.IValueMapper>; + +namespace BLToolkit.Mapping +{ + [CLSCompliant(false)] + public interface IMapDataSource + { + int Count { get; } + + Type GetFieldType (int index); + string GetName (int index); + int GetOrdinal (string name); + object GetValue (object o, int index); + object GetValue (object o, string name); + + bool IsNull (object o, int index); + + bool SupportsTypedValues(int index); + + // Simple type getters. + // + [CLSCompliant(false)] + SByte GetSByte (object o, int index); + Int16 GetInt16 (object o, int index); + Int32 GetInt32 (object o, int index); + Int64 GetInt64 (object o, int index); + + Byte GetByte (object o, int index); + [CLSCompliant(false)] + UInt16 GetUInt16 (object o, int index); + [CLSCompliant(false)] + UInt32 GetUInt32 (object o, int index); + [CLSCompliant(false)] + UInt64 GetUInt64 (object o, int index); + + Boolean GetBoolean (object o, int index); + Char GetChar (object o, int index); + Single GetSingle (object o, int index); + Double GetDouble (object o, int index); + Decimal GetDecimal (object o, int index); + DateTime GetDateTime (object o, int index); + Guid GetGuid (object o, int index); + +#if FW2 + // Simple type getters. + // + [CLSCompliant(false)] + SByte? GetNullableSByte (object o, int index); + Int16? GetNullableInt16 (object o, int index); + Int32? GetNullableInt32 (object o, int index); + Int64? GetNullableInt64 (object o, int index); + + Byte? GetNullableByte (object o, int index); + [CLSCompliant(false)] + UInt16? GetNullableUInt16 (object o, int index); + [CLSCompliant(false)] + UInt32? GetNullableUInt32 (object o, int index); + [CLSCompliant(false)] + UInt64? GetNullableUInt64 (object o, int index); + + Boolean? GetNullableBoolean (object o, int index); + Char? GetNullableChar (object o, int index); + Single? GetNullableSingle (object o, int index); + Double? GetNullableDouble (object o, int index); + Decimal? GetNullableDecimal (object o, int index); + DateTime? GetNullableDateTime(object o, int index); + Guid? GetNullableGuid (object o, int index); +#endif + + // SQL type getters. + // + SqlByte GetSqlByte (object o, int index); + SqlInt16 GetSqlInt16 (object o, int index); + SqlInt32 GetSqlInt32 (object o, int index); + SqlInt64 GetSqlInt64 (object o, int index); + SqlSingle GetSqlSingle (object o, int index); + SqlBoolean GetSqlBoolean (object o, int index); + SqlDouble GetSqlDouble (object o, int index); + SqlDateTime GetSqlDateTime (object o, int index); + SqlDecimal GetSqlDecimal (object o, int index); + SqlMoney GetSqlMoney (object o, int index); + SqlGuid GetSqlGuid (object o, int index); + SqlString GetSqlString (object o, int index); + } + + [CLSCompliant(false)] + public interface IMapDataDestination + { + Type GetFieldType (int index); + int GetOrdinal (string name); + void SetValue (object o, int index, object value); + void SetValue (object o, string name, object value); + + void SetNull (object o, int index); + + bool SupportsTypedValues(int index); + + // Simple type setters. + // + [CLSCompliant(false)] + void SetSByte (object o, int index, SByte value); + void SetInt16 (object o, int index, Int16 value); + void SetInt32 (object o, int index, Int32 value); + void SetInt64 (object o, int index, Int64 value); + + void SetByte (object o, int index, Byte value); + [CLSCompliant(false)] + void SetUInt16 (object o, int index, UInt16 value); + [CLSCompliant(false)] + void SetUInt32 (object o, int index, UInt32 value); + [CLSCompliant(false)] + void SetUInt64 (object o, int index, UInt64 value); + + void SetBoolean (object o, int index, Boolean value); + void SetChar (object o, int index, Char value); + void SetSingle (object o, int index, Single value); + void SetDouble (object o, int index, Double value); + void SetDecimal (object o, int index, Decimal value); + void SetGuid (object o, int index, Guid value); + void SetDateTime (object o, int index, DateTime value); + +#if FW2 + // Simple type setters. + // + [CLSCompliant(false)] + void SetNullableSByte (object o, int index, SByte? value); + void SetNullableInt16 (object o, int index, Int16? value); + void SetNullableInt32 (object o, int index, Int32? value); + void SetNullableInt64 (object o, int index, Int64? value); + + void SetNullableByte (object o, int index, Byte? value); + [CLSCompliant(false)] + void SetNullableUInt16 (object o, int index, UInt16? value); + [CLSCompliant(false)] + void SetNullableUInt32 (object o, int index, UInt32? value); + [CLSCompliant(false)] + void SetNullableUInt64 (object o, int index, UInt64? value); + + void SetNullableBoolean (object o, int index, Boolean? value); + void SetNullableChar (object o, int index, Char? value); + void SetNullableSingle (object o, int index, Single? value); + void SetNullableDouble (object o, int index, Double? value); + void SetNullableDecimal (object o, int index, Decimal? value); + void SetNullableGuid (object o, int index, Guid? value); + void SetNullableDateTime (object o, int index, DateTime? value); +#endif + + // SQL type setters. + // + void SetSqlByte (object o, int index, SqlByte value); + void SetSqlInt16 (object o, int index, SqlInt16 value); + void SetSqlInt32 (object o, int index, SqlInt32 value); + void SetSqlInt64 (object o, int index, SqlInt64 value); + void SetSqlSingle (object o, int index, SqlSingle value); + void SetSqlBoolean (object o, int index, SqlBoolean value); + void SetSqlDouble (object o, int index, SqlDouble value); + void SetSqlDateTime(object o, int index, SqlDateTime value); + void SetSqlDecimal (object o, int index, SqlDecimal value); + void SetSqlMoney (object o, int index, SqlMoney value); + void SetSqlGuid (object o, int index, SqlGuid value); + void SetSqlString (object o, int index, SqlString value); + } + + [CLSCompliant(false)] + public interface IValueMapper + { + void Map( + IMapDataSource source, object sourceObject, int sourceIndex, + IMapDataDestination dest, object destObject, int destIndex); + } + + public static partial class ValueMapping + { + #region Init + + private static Table _mappers = new Table(); + + private static void AddSameType(Type type, IValueMapper mapper) + { + _mappers.Add(new KeyValue(type, type), mapper); + } + + #endregion + + #region Default Mapper + + class DefaultValueMapper : IValueMapper + { + public void Map( + IMapDataSource source, object sourceObject, int sourceIndex, + IMapDataDestination dest, object destObject, int destIndex) + { + dest.SetValue(destObject, destIndex, source.GetValue(sourceObject, sourceIndex)); + + //object o = source.GetValue(sourceObject, sourceIndex); + + //if (o == null) dest.SetNull (destObject, destIndex); + //else dest.SetValue(destObject, destIndex, o); + } + } + + private static IValueMapper _defaultMapper = new DefaultValueMapper(); + [CLSCompliant(false)] + public static IValueMapper DefaultMapper + { + get { return _defaultMapper; } + set { _defaultMapper = value; } + } + + #endregion + + #region GetMapper + + private static object _sync = new object(); + + [CLSCompliant(false)] + public static IValueMapper GetMapper(Type t1, Type t2) + { + lock (_sync) + { + if (t1 == null) t1 = typeof(object); + if (t2 == null) t2 = typeof(object); + + if (t1.IsEnum) t1 = Enum.GetUnderlyingType(t1); + if (t2.IsEnum) t2 = Enum.GetUnderlyingType(t2); + + KeyValue key = new KeyValue(t1, t2); + + IValueMapper t; + +#if FW2 + if (_mappers.TryGetValue(key, out t)) + return t; + +#else + t = (IValueMapper)_mappers[key]; + + if (t != null) + return t; + + t = _defaultMapper; +#endif + _mappers.Add(key, t); + + return t; + } + } + + #endregion + } +}