0
|
1 using System;
|
|
2 using System.Collections;
|
|
3
|
|
4 using BLToolkit.Common;
|
|
5 using BLToolkit.Reflection;
|
|
6
|
|
7 namespace BLToolkit.Mapping
|
|
8 {
|
|
9 public class DictionaryListMapper : IMapDataDestinationList
|
|
10 {
|
|
11 public DictionaryListMapper(
|
|
12 IDictionary dic,
|
|
13 NameOrIndexParameter keyField,
|
|
14 ObjectMapper objectMapper)
|
|
15 {
|
|
16 _dic = dic;
|
|
17 _mapper = objectMapper;
|
|
18 _fromSource = keyField.ByName && keyField.Name[0] == '@';
|
|
19 _keyField = _fromSource? keyField.Name.Substring(1): keyField;
|
|
20 }
|
|
21
|
|
22 private readonly IDictionary _dic;
|
|
23 private readonly bool _fromSource;
|
|
24 private NameOrIndexParameter _keyField;
|
|
25 private ObjectMapper _mapper;
|
|
26 private object _newObject;
|
|
27 private object _keyValue;
|
|
28
|
|
29 #region IMapDataDestinationList Members
|
|
30
|
|
31 private void AddObject()
|
|
32 {
|
|
33 if (_newObject != null)
|
|
34 {
|
|
35 if (!_fromSource)
|
|
36 _keyValue = _mapper.TypeAccessor[_keyField].GetValue(_newObject);
|
|
37
|
|
38 _dic[_keyValue] = _newObject;
|
|
39 }
|
|
40 }
|
|
41
|
|
42 public virtual void InitMapping(InitContext initContext)
|
|
43 {
|
|
44 ISupportMapping sm = _dic as ISupportMapping;
|
|
45
|
|
46 if (sm != null)
|
|
47 {
|
|
48 sm.BeginMapping(initContext);
|
|
49
|
|
50 if (_mapper != initContext.ObjectMapper)
|
|
51 _mapper = initContext.ObjectMapper;
|
|
52 }
|
|
53 }
|
|
54
|
|
55 [CLSCompliant(false)]
|
|
56 public virtual IMapDataDestination GetDataDestination(InitContext initContext)
|
|
57 {
|
|
58 return _mapper;
|
|
59 }
|
|
60
|
|
61 static readonly char[] _trim = { ' ' };
|
|
62
|
|
63 public virtual object GetNextObject(InitContext initContext)
|
|
64 {
|
|
65 AddObject();
|
|
66
|
|
67 if (_fromSource)
|
|
68 {
|
|
69 _keyValue = _keyField.ByName ?
|
|
70 initContext.DataSource.GetValue(initContext.SourceObject, _keyField.Name) :
|
|
71 initContext.DataSource.GetValue(initContext.SourceObject, _keyField.Index);
|
|
72
|
|
73 if (Common.Configuration.TrimDictionaryKey && _keyValue is string)
|
|
74 _keyValue = _keyValue.ToString().TrimEnd(_trim);
|
|
75 }
|
|
76
|
|
77 return _newObject = _mapper.CreateInstance(initContext);
|
|
78 }
|
|
79
|
|
80 public virtual void EndMapping(InitContext initContext)
|
|
81 {
|
|
82 AddObject();
|
|
83
|
|
84 ISupportMapping sm = _dic as ISupportMapping;
|
|
85
|
|
86 if (sm != null)
|
|
87 sm.EndMapping(initContext);
|
|
88 }
|
|
89
|
|
90 #endregion
|
|
91 }
|
|
92 }
|