Mercurial > pub > bltoolkit
diff Source/Mapping/DictionaryIndexListMapper.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/DictionaryIndexListMapper.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,104 @@ +using System; +using System.Collections; + +using BLToolkit.Common; +using BLToolkit.Reflection; + +namespace BLToolkit.Mapping +{ + public class DictionaryIndexListMapper : IMapDataDestinationList + { + public DictionaryIndexListMapper( + IDictionary dic, + MapIndex index, + ObjectMapper objectMapper) + { + _dic = dic; + _mapper = objectMapper; + + _fields = new NameOrIndexParameter[index.Fields.Length]; + _fromSource = new bool[index.Fields.Length]; + + for (int i = 0; i < _fields.Length; i++) + { + bool fromSource = index.Fields[i].ByName && index.Fields[i].Name[0] == '@'; + + _fields[i] = fromSource? index.Fields[i].Name.Substring(1): index.Fields[i]; + _fromSource[i] = fromSource; + _isFromSource = _isFromSource || fromSource; + _isFromDest = _isFromDest || !fromSource; + } + } + + private readonly NameOrIndexParameter[] _fields; + private readonly IDictionary _dic; + private readonly bool[] _fromSource; + private readonly bool _isFromSource; + private readonly bool _isFromDest; + private ObjectMapper _mapper; + private object _newObject; + private object[] _indexValue; + + #region IMapDataDestinationList Members + + private void AddObject() + { + if (_newObject != null) + { + if (_isFromDest) + for (int i = 0; i < _fields.Length; i++) + if (!_fromSource[i]) + _indexValue[i] = _mapper.TypeAccessor[_fields[i]].GetValue(_newObject); + + _dic[new CompoundValue(_indexValue)] = _newObject; + } + } + + public virtual void InitMapping(InitContext initContext) + { + var sm = _dic as ISupportMapping; + + if (sm != null) + { + sm.BeginMapping(initContext); + + if (_mapper != initContext.ObjectMapper) + _mapper = initContext.ObjectMapper; + } + } + + [CLSCompliant(false)] + public virtual IMapDataDestination GetDataDestination(InitContext initContext) + { + return _mapper; + } + + public virtual object GetNextObject(InitContext initContext) + { + AddObject(); + + _indexValue = new object[_fields.Length]; + + if (_isFromSource) + for (int i = 0; i < _fields.Length; i++) + if (_fromSource[i]) + _indexValue[i] = _fields[i].ByName ? + initContext.DataSource.GetValue( initContext.SourceObject, _fields[i].Name) : + initContext.DataSource.GetValue( initContext.SourceObject, _fields[i].Index); + + return _newObject = _mapper.CreateInstance(initContext); + } + + public virtual void EndMapping(InitContext initContext) + { + AddObject(); + + ISupportMapping sm = _dic as ISupportMapping; + + if (sm != null) + sm.EndMapping(initContext); + } + + #endregion + } +}