Mercurial > pub > bltoolkit
diff Source/Mapping/DictionaryMapper.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/DictionaryMapper.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,115 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace BLToolkit.Mapping +{ + public class DictionaryMapper : MapDataSourceDestinationBase + { + public DictionaryMapper(IDictionary dictionary) + { + if (dictionary == null) throw new ArgumentNullException("dictionary"); + + _dictionary = dictionary; + } + + private readonly IDictionary _dictionary; + public IDictionary Dictionary + { + get { return _dictionary; } + } + + private int _currentIndex; + private IDictionaryEnumerator _enumerator; + + private void SetEnumerator(int i) + { + if (_enumerator == null) + { + _enumerator = _dictionary.GetEnumerator(); + _enumerator.MoveNext(); + } + + if (_currentIndex > i) + { + _currentIndex = 0; + _enumerator.Reset(); + _enumerator.MoveNext(); + } + + for (; _currentIndex < i; _currentIndex++) + _enumerator.MoveNext(); + } + + #region IMapDataSource Members + + public override int Count + { + get { return _dictionary.Count; } + } + + public override Type GetFieldType(int index) + { + SetEnumerator(index); + return _enumerator.Value == null? typeof(object): _enumerator.Value.GetType(); + } + + public override string GetName(int index) + { + SetEnumerator(index); + return _enumerator.Key.ToString(); + } + + public override bool SupportsTypedValues(int index) + { + return index < _dictionary.Count; + } + + public override object GetValue(object o, int index) + { + SetEnumerator(index); + return _enumerator.Value; + } + + public override object GetValue(object o, string name) + { + return _dictionary.Contains(name) ? _dictionary[name] : null; + } + + #endregion + + #region IMapDataDestination Members + + private List<string> _nameList; + + public override int GetOrdinal(string name) + { + if (_nameList == null) + _nameList = new List<string>(); + + var idx = _nameList.IndexOf(name); + + if (idx >= 0) + return idx; + + _nameList.Add(name); + + return _nameList.Count - 1; + } + + public override void SetValue(object o, int index, object value) + { + SetValue(o, _nameList[index], value); + } + + public override void SetValue(object o, string name, object value) + { + if (_dictionary.Contains(name)) + _dictionary[name] = value; + else + _dictionary.Add(name, value); + } + + #endregion + } +}