Mercurial > pub > bltoolkit
diff Source/Mapping/MapMemberInfo.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/Mapping/MapMemberInfo.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; + +using BLToolkit.DataAccess; +using BLToolkit.Reflection; +using BLToolkit.Reflection.Extension; + +namespace BLToolkit.Mapping +{ + [DebuggerStepThrough] + public class MapMemberInfo + { + public MapMemberInfo() + { + DbType = DbType.Object; + } + + public MemberAccessor MemberAccessor { get; set; } + public MemberAccessor ComplexMemberAccessor { get; set; } + public string Name { get; set; } + public string MemberName { get; set; } + public string Storage { get; set; } + public bool IsInheritanceDiscriminator { get; set; } + public bool Trimmable { get; set; } + public bool SqlIgnore { get; set; } + public bool Nullable { get; set; } + public object NullValue { get; set; } + public object DefaultValue { get; set; } + public Type Type { get; set; } + public int DbSize { get; set; } + public bool IsDbTypeSet { get; set; } + public bool IsDbSizeSet { get; set; } + public MappingSchema MappingSchema { get; set; } + public MemberExtension MemberExtension { get; set; } + public DbType DbType { get; set; } + public KeyGenerator KeyGenerator { get; set; } + + private MapValue[] _mapValues; + public MapValue[] MapValues + { + get { return _mapValues; } + set + { + _mapValues = value; + if (value != null) + CacheMapValues(); + else + { + _mapValueCache = new Dictionary<object, object>(); + _origValueCache = new Dictionary<object, object>(); + } + } + } + + private Dictionary<object,object> _mapValueCache; + + public bool TryGetOrigValue(object mapedValue, out object origValue) + { + return _mapValueCache.TryGetValue(mapedValue, out origValue); + } + + private Dictionary<object,object> _origValueCache; + + public bool TryGetMapValue(object origValue, out object mapValue) + { + return _origValueCache.TryGetValue(origValue, out mapValue); + } + + private void CacheMapValues() + { + _mapValueCache = new Dictionary<object,object>(); + + foreach (var mv in MapValues) + foreach (var mapValue in mv.MapValues) + { + _mapValueCache[mapValue] = mv.OrigValue; + + // this fixes spesial case for char + if (mapValue is char) + { + var str = new string(new[] { (char)mapValue }); + _mapValueCache[str] = mv.OrigValue; + } + } + + _origValueCache = new Dictionary<object, object>(); + + foreach (var mv in MapValues) + { + // previous behaviour - first wins! + // yah, no... + // any wins - attributes order is not specified + // and memberInfo.GetCustomAttributes(...) order and can differ + if (!_origValueCache.ContainsKey(mv.OrigValue)) + _origValueCache[mv.OrigValue] = mv.MapValues[0]; + } + } + } +}