0
|
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 }
|