comparison Source/Mapping/DictionaryMapper.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:f990fcb411a9
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4
5 namespace BLToolkit.Mapping
6 {
7 public class DictionaryMapper : MapDataSourceDestinationBase
8 {
9 public DictionaryMapper(IDictionary dictionary)
10 {
11 if (dictionary == null) throw new ArgumentNullException("dictionary");
12
13 _dictionary = dictionary;
14 }
15
16 private readonly IDictionary _dictionary;
17 public IDictionary Dictionary
18 {
19 get { return _dictionary; }
20 }
21
22 private int _currentIndex;
23 private IDictionaryEnumerator _enumerator;
24
25 private void SetEnumerator(int i)
26 {
27 if (_enumerator == null)
28 {
29 _enumerator = _dictionary.GetEnumerator();
30 _enumerator.MoveNext();
31 }
32
33 if (_currentIndex > i)
34 {
35 _currentIndex = 0;
36 _enumerator.Reset();
37 _enumerator.MoveNext();
38 }
39
40 for (; _currentIndex < i; _currentIndex++)
41 _enumerator.MoveNext();
42 }
43
44 #region IMapDataSource Members
45
46 public override int Count
47 {
48 get { return _dictionary.Count; }
49 }
50
51 public override Type GetFieldType(int index)
52 {
53 SetEnumerator(index);
54 return _enumerator.Value == null? typeof(object): _enumerator.Value.GetType();
55 }
56
57 public override string GetName(int index)
58 {
59 SetEnumerator(index);
60 return _enumerator.Key.ToString();
61 }
62
63 public override bool SupportsTypedValues(int index)
64 {
65 return index < _dictionary.Count;
66 }
67
68 public override object GetValue(object o, int index)
69 {
70 SetEnumerator(index);
71 return _enumerator.Value;
72 }
73
74 public override object GetValue(object o, string name)
75 {
76 return _dictionary.Contains(name) ? _dictionary[name] : null;
77 }
78
79 #endregion
80
81 #region IMapDataDestination Members
82
83 private List<string> _nameList;
84
85 public override int GetOrdinal(string name)
86 {
87 if (_nameList == null)
88 _nameList = new List<string>();
89
90 var idx = _nameList.IndexOf(name);
91
92 if (idx >= 0)
93 return idx;
94
95 _nameList.Add(name);
96
97 return _nameList.Count - 1;
98 }
99
100 public override void SetValue(object o, int index, object value)
101 {
102 SetValue(o, _nameList[index], value);
103 }
104
105 public override void SetValue(object o, string name, object value)
106 {
107 if (_dictionary.Contains(name))
108 _dictionary[name] = value;
109 else
110 _dictionary.Add(name, value);
111 }
112
113 #endregion
114 }
115 }