annotate Source/Mapping/DictionaryIndexListMapper.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using BLToolkit.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 namespace BLToolkit.Mapping
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 public class DictionaryIndexListMapper : IMapDataDestinationList
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 public DictionaryIndexListMapper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 IDictionary dic,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 MapIndex index,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 ObjectMapper objectMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 _dic = dic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 _mapper = objectMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 _fields = new NameOrIndexParameter[index.Fields.Length];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 _fromSource = new bool[index.Fields.Length];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 for (int i = 0; i < _fields.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 bool fromSource = index.Fields[i].ByName && index.Fields[i].Name[0] == '@';
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 _fields[i] = fromSource? index.Fields[i].Name.Substring(1): index.Fields[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 _fromSource[i] = fromSource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 _isFromSource = _isFromSource || fromSource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 _isFromDest = _isFromDest || !fromSource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 private readonly NameOrIndexParameter[] _fields;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 private readonly IDictionary _dic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 private readonly bool[] _fromSource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 private readonly bool _isFromSource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 private readonly bool _isFromDest;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 private ObjectMapper _mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 private object _newObject;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 private object[] _indexValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 #region IMapDataDestinationList Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 private void AddObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 if (_newObject != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 if (_isFromDest)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 for (int i = 0; i < _fields.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 if (!_fromSource[i])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 _indexValue[i] = _mapper.TypeAccessor[_fields[i]].GetValue(_newObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 _dic[new CompoundValue(_indexValue)] = _newObject;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 public virtual void InitMapping(InitContext initContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 var sm = _dic as ISupportMapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 if (sm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 sm.BeginMapping(initContext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 if (_mapper != initContext.ObjectMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 _mapper = initContext.ObjectMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 public virtual IMapDataDestination GetDataDestination(InitContext initContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 return _mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 public virtual object GetNextObject(InitContext initContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 AddObject();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 _indexValue = new object[_fields.Length];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 if (_isFromSource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 for (int i = 0; i < _fields.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 if (_fromSource[i])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 _indexValue[i] = _fields[i].ByName ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 initContext.DataSource.GetValue( initContext.SourceObject, _fields[i].Name) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 initContext.DataSource.GetValue( initContext.SourceObject, _fields[i].Index);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 return _newObject = _mapper.CreateInstance(initContext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 public virtual void EndMapping(InitContext initContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 AddObject();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 ISupportMapping sm = _dic as ISupportMapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 if (sm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 sm.EndMapping(initContext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 }