annotate Source/Mapping/DictionaryListMapperT.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.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Diagnostics;
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 DictionaryListMapper<K,T> : IMapDataDestinationList
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 public DictionaryListMapper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 IDictionary<K,T> dic,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 NameOrIndexParameter keyField,
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 _keyGetter = MapGetData<K>.I;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 _fromSource = keyField.ByName && keyField.Name[0] == '@';
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 _keyField = _fromSource? keyField.Name.Substring(1): keyField;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 private readonly IDictionary<K,T> _dic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 private readonly bool _fromSource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 private readonly MapGetData<K>.MB<K> _keyGetter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 private NameOrIndexParameter _keyField;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 private int _index;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 private ObjectMapper _mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 private object _newObject;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 private bool _typeMismatch;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 private K _keyValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 #region IMapDataDestinationList Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 private void AddObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 if (_newObject != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 if (_typeMismatch)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 _keyValue = _mapper.MappingSchema.ConvertTo<K,object>(_mapper[_index].GetValue(_newObject));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 else if (!_fromSource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 _keyValue = _keyGetter.From(_mapper, _newObject, _index);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 _dic[_keyValue] = (T)_newObject;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 public virtual void InitMapping(InitContext initContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 var sm = _dic as ISupportMapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 if (sm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 sm.BeginMapping(initContext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 if (_mapper != initContext.ObjectMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 _mapper = initContext.ObjectMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 if (_fromSource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 _index = _keyField.ByName? initContext.DataSource.GetOrdinal(_keyField.Name): _keyField.Index;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 _index = _keyField.ByName? _mapper.GetOrdinal(_keyField.Name, true): _keyField.Index;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 if (_index < 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 throw new MappingException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 _keyField.ByName?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 string.Format("Field '{0}' not found.", _keyField.Name):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 string.Format("Index '{0}' is invalid.", _keyField.Index));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 var mm = _mapper[_index];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 _typeMismatch = !TypeHelper.IsSameOrParent(typeof(K), mm.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 Debug.WriteLineIf(_typeMismatch, string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 "Member {0} type '{1}' does not match dictionary key type '{2}'.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 mm.Name, mm.Type.Name, (typeof(K).Name)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 public virtual IMapDataDestination GetDataDestination(InitContext initContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 return _mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 static readonly char[] _trim = { ' ' };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 public virtual object GetNextObject(InitContext initContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 AddObject();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 if (_fromSource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 _keyValue = _keyGetter.From(initContext.DataSource, initContext.SourceObject, _index);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 if (Common.Configuration.TrimDictionaryKey && _keyValue is string)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 _keyValue = (K)(object)_keyValue.ToString().TrimEnd(_trim);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 return _newObject = _mapper.CreateInstance(initContext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 public virtual void EndMapping(InitContext initContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 AddObject();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 ISupportMapping sm = _dic as ISupportMapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 if (sm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 sm.EndMapping(initContext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 }