diff --git a/Source/Mapping/ValueMapping.cs b/Source/Mapping/ValueMapping.cs index ffcdc4c1c..c2767c0bf 100644 --- a/Source/Mapping/ValueMapping.cs +++ b/Source/Mapping/ValueMapping.cs @@ -1,155 +1,161 @@ -using System; - -using BLToolkit.Common; - -using KeyValue = System.Collections.Generic.KeyValuePair; -using Table = System.Collections.Generic.Dictionary, BLToolkit.Mapping.IValueMapper>; - -namespace BLToolkit.Mapping -{ - public static class ValueMapping - { - #region Init - - private static readonly Table _mappers = new Table(); - - #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 readonly object _sync = new object(); - - [CLSCompliant(false)] - public static IValueMapper GetMapper(Type t1, Type t2) - { - 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); - - var key = new KeyValue(t1, t2); - - lock (_sync) - { - IValueMapper t; - - if (_mappers.TryGetValue(key, out t)) - return t; - - //t = BLToolkit.Mapping.ValueMappingInternal.MapperSelector.GetMapper(t1, t2); - - if (null == t) - { - var type = typeof(GetSetDataChecker<,>).MakeGenericType(t1, t2); - - if (((IGetSetDataChecker)Activator.CreateInstance(type)).Check() == false) - { - t = _defaultMapper; - } - else - { - type = t1 == t2 ? - typeof(ValueMapper<>).MakeGenericType(t1) : - typeof(ValueMapper<,>).MakeGenericType(t1, t2); - - t = (IValueMapper)Activator.CreateInstance(type); - } - } - - _mappers.Add(key, t); - - return t; - } - } - - #endregion - - #region Generic Mappers - - interface IGetSetDataChecker - { - bool Check(); - } - - class GetSetDataChecker : IGetSetDataChecker - { - public bool Check() - { - return - !(MapGetData.I is MapGetData.Default) && - !(MapSetData.I is MapSetData.Default) && - !(MapGetData.I is MapGetData.Default) && - !(MapSetData.I is MapSetData.Default); - } - } - - class ValueMapper : IValueMapper - { - public void Map( - IMapDataSource source, object sourceObject, int sourceIndex, - IMapDataDestination dest, object destObject, int destIndex) - { - if (source.IsNull(sourceObject, sourceIndex)) - dest.SetNull(destObject, destIndex); - else - { - var setter = MapSetData.I; - var getter = MapGetData.I; - - setter.To(dest, destObject, destIndex, - getter.From(source, sourceObject, sourceIndex)); - } - } - } - - class ValueMapper : IValueMapper - { - public void Map( - IMapDataSource source, object sourceObject, int sourceIndex, - IMapDataDestination dest, object destObject, int destIndex) - { - if (source.IsNull(sourceObject, sourceIndex)) - dest.SetNull(destObject, destIndex); - else - { - var setter = MapSetData.I; - var getter = MapGetData.I; - var converter = Convert.From; - - setter.To(dest, destObject, destIndex, - converter(getter.From(source, sourceObject, sourceIndex))); - } - } - } - - #endregion - } -} +using System; + +using BLToolkit.Common; + +using KeyValue = System.Collections.Generic.KeyValuePair; +using Table = System.Collections.Generic.Dictionary, BLToolkit.Mapping.IValueMapper>; + +namespace BLToolkit.Mapping +{ + public static class ValueMapping + { + #region Init + + private static readonly Table _mappers = new Table(); + + #endregion + + #region Default Mapper + + class DefaultValueMapper : IValueMapper + { + public void Map( + IMapDataSource source, object sourceObject, int sourceIndex, + IMapDataDestination dest, object destObject, int destIndex) + { + var val = source.GetValue(sourceObject, sourceIndex); + + dest.SetValue(destObject, destIndex, val); + + // some objects (like oracle blobs) are disposable + var disp = val as IDisposable; + if (disp != null) disp.Dispose(); + + //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 readonly object _sync = new object(); + + [CLSCompliant(false)] + public static IValueMapper GetMapper(Type t1, Type t2) + { + 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); + + var key = new KeyValue(t1, t2); + + lock (_sync) + { + IValueMapper t; + + if (_mappers.TryGetValue(key, out t)) + return t; + + //t = BLToolkit.Mapping.ValueMappingInternal.MapperSelector.GetMapper(t1, t2); + + if (null == t) + { + var type = typeof(GetSetDataChecker<,>).MakeGenericType(t1, t2); + + if (((IGetSetDataChecker)Activator.CreateInstance(type)).Check() == false) + { + t = _defaultMapper; + } + else + { + type = t1 == t2 ? + typeof(ValueMapper<>).MakeGenericType(t1) : + typeof(ValueMapper<,>).MakeGenericType(t1, t2); + + t = (IValueMapper)Activator.CreateInstance(type); + } + } + + _mappers.Add(key, t); + + return t; + } + } + + #endregion + + #region Generic Mappers + + interface IGetSetDataChecker + { + bool Check(); + } + + class GetSetDataChecker : IGetSetDataChecker + { + public bool Check() + { + return + !(MapGetData.I is MapGetData.Default) && + !(MapSetData.I is MapSetData.Default) && + !(MapGetData.I is MapGetData.Default) && + !(MapSetData.I is MapSetData.Default); + } + } + + class ValueMapper : IValueMapper + { + public void Map( + IMapDataSource source, object sourceObject, int sourceIndex, + IMapDataDestination dest, object destObject, int destIndex) + { + if (source.IsNull(sourceObject, sourceIndex)) + dest.SetNull(destObject, destIndex); + else + { + var setter = MapSetData.I; + var getter = MapGetData.I; + + setter.To(dest, destObject, destIndex, + getter.From(source, sourceObject, sourceIndex)); + } + } + } + + class ValueMapper : IValueMapper + { + public void Map( + IMapDataSource source, object sourceObject, int sourceIndex, + IMapDataDestination dest, object destObject, int destIndex) + { + if (source.IsNull(sourceObject, sourceIndex)) + dest.SetNull(destObject, destIndex); + else + { + var setter = MapSetData.I; + var getter = MapGetData.I; + var converter = Convert.From; + + setter.To(dest, destObject, destIndex, + converter(getter.From(source, sourceObject, sourceIndex))); + } + } + } + + #endregion + } +}