Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.Mapping.DictionaryListMapper.cs

 
using System;
using System.Collections;

using BLToolkit.Common;
using BLToolkit.Reflection;

namespace BLToolkit.Mapping
{
    public class DictionaryListMapper : IMapDataDestinationList
    {
        public DictionaryListMapper(
            IDictionary          dic,
            NameOrIndexParameter keyField,
            ObjectMapper         objectMapper)
        {
            _dic        = dic;
            _mapper     = objectMapper;
            _fromSource = keyField.ByName && keyField.Name[0] == '@';
            _keyField   = _fromSource? keyField.Name.Substring(1): keyField;
        }

        private readonly IDictionary          _dic;
        private readonly bool                 _fromSource;
        private          NameOrIndexParameter _keyField;
        private          ObjectMapper         _mapper;
        private          object               _newObject;
        private          object               _keyValue;

        #region IMapDataDestinationList Members

        private void AddObject()
        {
            if (_newObject != null)
            {
                if (!_fromSource)
                    _keyValue = _mapper.TypeAccessor[_keyField].GetValue(_newObject);

                _dic[_keyValue]  = _newObject;
            }
        }

        public virtual void InitMapping(InitContext initContext)
        {
            ISupportMapping 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;
        }

        static readonly char[] _trim = { ' ' };

        public virtual object GetNextObject(InitContext initContext)
        {
            AddObject();

            if (_fromSource)
            {
                _keyValue = _keyField.ByName ? 
                    initContext.DataSource.GetValue(initContext.SourceObject, _keyField.Name) :
                    initContext.DataSource.GetValue(initContext.SourceObject, _keyField.Index);

                if (Common.Configuration.TrimDictionaryKey && _keyValue is string)
                    _keyValue = _keyValue.ToString().TrimEnd(_trim);
            }

            return _newObject = _mapper.CreateInstance(initContext);
        }

        public virtual void EndMapping(InitContext initContext)
        {
            AddObject();

            ISupportMapping sm = _dic as ISupportMapping;

            if (sm != null)
                sm.EndMapping(initContext);
        }

        #endregion
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net