annotate Source/Mapping/ObjectMapper.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 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Data.SqlTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Diagnostics.CodeAnalysis;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Globalization;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 namespace BLToolkit.Mapping
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using DataAccess;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 using Reflection.Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using Reflection.MetadataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 [DebuggerDisplay("Type = {TypeAccessor.Type}, OriginalType = {TypeAccessor.OriginalType}")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 public class ObjectMapper : MapDataSourceDestinationBase, IEnumerable<MemberMapper>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 #region Protected Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 protected virtual MemberMapper CreateMemberMapper(MapMemberInfo mapMemberInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 MemberMapper mm = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 var attr = mapMemberInfo.MemberAccessor.GetAttribute<MemberMapperAttribute>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 MemberExtension ext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 if (_extension != null && _extension.Members.TryGetValue(mapMemberInfo.MemberName,out ext))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 AttributeExtensionCollection attrExt;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 if (ext.Attributes.TryGetValue("MemberMapper", out attrExt))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 attr = new MemberMapperAttribute((Type)attrExt[0].Values["MemberMapperType"]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 if (attr == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 var attrs = TypeHelper.GetAttributes(mapMemberInfo.Type, typeof(MemberMapperAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 foreach (MemberMapperAttribute a in attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 if (a.MemberType == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 mm = a.MemberMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 mm = attr.MemberMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 if (mm == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 var attrs = TypeHelper.GetAttributes(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 mapMemberInfo.MemberAccessor.MemberInfo.DeclaringType, typeof(MemberMapperAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 foreach (MemberMapperAttribute a in attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 if (a.MemberType == mapMemberInfo.Type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 mm = a.MemberMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 if (mm == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 mm = MemberMapper.CreateMemberMapper(mapMemberInfo);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 mm.Init(mapMemberInfo);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 return mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 [SuppressMessage("Microsoft.Performance", "CA1807:AvoidUnnecessaryStringCreation", MessageId = "stack1")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 protected virtual void Add(MemberMapper memberMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 if (memberMapper == null) throw new ArgumentNullException("memberMapper");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 memberMapper.SetOrdinal(_members.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 _members .Add(memberMapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 _nameToMember .Add(memberMapper.Name.ToLower(), memberMapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 _memberNameToMember.Add(memberMapper.MemberName, memberMapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 protected virtual MetadataProviderBase CreateMetadataProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 return MetadataProviderBase.CreateProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 #region Public Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 private readonly List<MemberMapper> _members = new List<MemberMapper>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 public MemberMapper this[int index]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 get { return _members[index]; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 readonly List<Association> _associations = new List<Association>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 public List<Association> Associations
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 get { return _associations; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 readonly List<InheritanceMappingAttribute> _inheritanceMapping = new List<InheritanceMappingAttribute>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 public List<InheritanceMappingAttribute> InheritanceMapping
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 get { return _inheritanceMapping; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 protected TypeExtension _extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 public TypeExtension Extension
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 get { return _extension; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 set { _extension = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 private MetadataProviderBase _metadataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 public MetadataProviderBase MetadataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 get { return _metadataProvider ?? (_metadataProvider = CreateMetadataProvider()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 set { _metadataProvider = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 private string[] _fieldNames;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 public string[] FieldNames
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 if (_fieldNames == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 _fieldNames = new string[_members.Count];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 for (var i = 0; i < _fieldNames.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 _fieldNames[i] = _members[i].Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 return _fieldNames;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 private readonly Dictionary<string,MemberMapper> _nameToMember = new Dictionary<string,MemberMapper>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 private readonly Dictionary<string,MemberMapper> _memberNameToMember = new Dictionary<string,MemberMapper>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 public MemberMapper this[string name]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 if (name == null) throw new ArgumentNullException("name");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 lock (_nameToMember)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 MemberMapper mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 if (!_nameToMember.TryGetValue(name, out mm))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 if (!_nameToMember.TryGetValue(name.ToLower(CultureInfo.CurrentCulture), out mm))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 lock (_memberNameToMember)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 if (_memberNameToMember.ContainsKey(name) || _memberNameToMember.ContainsKey(name.ToLower(CultureInfo.CurrentCulture)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 mm = GetComplexMapper(name, name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 if (mm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 if (_members.Contains(mm))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 //throw new MappingException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 // "Wrong mapping field name: '{0}', type: '{1}'. Use field name '{2}' instead.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 // name, _typeAccessor.OriginalType.Name, mm.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 Add(mm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 _nameToMember.Add(name, mm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 return mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 public MemberMapper this[string name, bool byPropertyName]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 MemberMapper mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 if (byPropertyName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 lock (_memberNameToMember)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 return _memberNameToMember.TryGetValue(name, out mm) ? mm : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 return this[name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 public int GetOrdinal(string name, bool byPropertyName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 if (byPropertyName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 for (var i = 0; i < _members.Count; ++i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 if (_members[i].MemberName == name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 return i;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 return -1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 return GetOrdinal(name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 protected TypeAccessor _typeAccessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 public TypeAccessor TypeAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 get { return _typeAccessor; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 private MappingSchema _mappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 public MappingSchema MappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 get { return _mappingSchema; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 #region Init Mapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 public virtual void Init(MappingSchema mappingSchema, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 if (type == null) throw new ArgumentNullException("type");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 _typeAccessor = TypeAccessor.GetAccessor(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 _mappingSchema = mappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 _extension = TypeExtension.GetTypeExtension(_typeAccessor.OriginalType, mappingSchema.Extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 _inheritanceMapping.AddRange(GetInheritanceMapping());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 foreach (MemberAccessor ma in _typeAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 var a = GetAssociation(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 if (a != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 _associations.Add(a);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 if (GetMapIgnore(ma))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 var mapFieldAttr = GetMapField(ma); // ma.GetAttribute<MapFieldAttribute>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 if (mapFieldAttr == null || (mapFieldAttr.OrigName == null && mapFieldAttr.Format == null))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 var mi = new MapMemberInfo();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 var dbTypeAttribute = GetDbType(ma); // ma.GetAttribute<DbTypeAttribute>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 if (dbTypeAttribute != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 mi.DbType = dbTypeAttribute.DbType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 mi.IsDbTypeSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 if (dbTypeAttribute.Size != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 mi.DbSize = dbTypeAttribute.Size.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 mi.IsDbSizeSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 mi.MemberAccessor = ma;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 mi.Type = ma.Type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 mi.MappingSchema = mappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 mi.MemberExtension = _extension[ma.Name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 mi.Name = GetFieldName (ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 mi.MemberName = ma.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 mi.Storage = GetFieldStorage(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 mi.IsInheritanceDiscriminator = GetInheritanceDiscriminator(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 mi.Trimmable = GetTrimmable (ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 mi.SqlIgnore = GetSqlIgnore (ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 mi.MapValues = GetMapValues (ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 mi.DefaultValue = GetDefaultValue(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 mi.Nullable = GetNullable (ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 mi.NullValue = GetNullValue (ma, mi.Nullable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 Add(CreateMemberMapper(mi));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 else if (mapFieldAttr.OrigName != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 EnsureMapper(mapFieldAttr.MapName, ma.Name + "." + mapFieldAttr.OrigName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 else //if (mapFieldAttr.Format != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 foreach (MemberMapper inner in _mappingSchema.GetObjectMapper(ma.Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 EnsureMapper(string.Format(mapFieldAttr.Format, inner.Name), ma.Name + "." + inner.MemberName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 foreach (var ae in _extension.Attributes["MapField"])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 var mapName = (string)ae["MapName"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 var origName = (string)ae["OrigName"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 if (mapName == null || origName == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 throw new MappingException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 "Type '{0}' has invalid extension. MapField MapName='{1}' OrigName='{2}'.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 type.FullName, mapName, origName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 EnsureMapper(mapName, origName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 MetadataProvider.EnsureMapper(TypeAccessor, MappingSchema, EnsureMapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 private MemberMapper EnsureMapper(string mapName, string origName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 var mm = this[mapName];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 if (mm == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 var name = mapName.ToLower();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 foreach (var m in _members)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 if (m.MemberAccessor.Name.ToLower() == name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 _nameToMember.Add(name, m);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 return m;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 mm = GetComplexMapper(mapName, origName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 if (mm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 Add(mm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 return mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 private readonly Dictionary<string,MemberMapper> _nameToComplexMapper = new Dictionary<string,MemberMapper>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 [SuppressMessage("Microsoft.Performance", "CA1807:AvoidUnnecessaryStringCreation", MessageId = "stack0")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 [SuppressMessage("Microsoft.Performance", "CA1807:AvoidUnnecessaryStringCreation", MessageId = "origName")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 protected MemberMapper GetComplexMapper(string mapName, string origName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 if (origName == null) throw new ArgumentNullException("origName");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 var name = origName.ToLower();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 var idx = origName.IndexOf('.');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 lock (_nameToComplexMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 MemberMapper mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 if (_nameToComplexMapper.TryGetValue(name, out mm))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 return mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 if (idx > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 name = name.Substring(0, idx);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 foreach (MemberAccessor ma in TypeAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 if (ma.Name.Length == name.Length && ma.Name.ToLower() == name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 var om = MappingSchema.GetObjectMapper(ma.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 if (om != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 mm = om.GetComplexMapper(mapName, origName.Substring(idx + 1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 if (mm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 var mi = new MapMemberInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 MemberAccessor = ma,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 ComplexMemberAccessor = mm.ComplexMemberAccessor,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 Type = mm.Type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 MappingSchema = MappingSchema,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 Name = mapName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 MemberName = origName
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 var mapper = new MemberMapper.ComplexMapper(mm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 var key = origName.ToLower();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 mapper.Init(mi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 if (_nameToComplexMapper.ContainsKey(key))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 _nameToComplexMapper[key] = mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 _nameToComplexMapper.Add(key, mapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 return mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 foreach (var m in _members)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 if (m.MemberAccessor.Name.Length == name.Length && m.MemberAccessor.Name.ToLower() == name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 if (_nameToComplexMapper.ContainsKey(name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 _nameToComplexMapper[name] = m;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 _nameToComplexMapper.Add(name, m);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 return m;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 // Under some conditions, this way lead to memory leaks.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 // In other hand, shaking mappers up every time lead to performance loss.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 // So we cache failed requests.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 // If this optimization is a memory leak for you, just comment out next line.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 if (_nameToComplexMapper.ContainsKey(name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 _nameToComplexMapper[name] = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 _nameToComplexMapper.Add(name, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 private MapValue[] GetMapValues(MemberAccessor member)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 var values = MetadataProvider.GetMapValues(Extension, member, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 return isSet? values: _mappingSchema.GetMapValues(member.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 protected virtual object GetDefaultValue(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 var value = MetadataProvider.GetDefaultValue(MappingSchema, Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 return isSet? value: _mappingSchema.GetDefaultValue(memberAccessor.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 protected virtual bool GetNullable(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 return MetadataProvider.GetNullable(MappingSchema, Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 protected virtual bool GetLazyInstance(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 return MetadataProvider.GetLazyInstance(MappingSchema, Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 protected virtual bool GetMapIgnore(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 return MetadataProvider.GetMapIgnore(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 protected virtual MapFieldAttribute GetMapField(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 return MetadataProvider.GetMapField(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489 protected virtual DbTypeAttribute GetDbType(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 return MetadataProvider.GetDbType(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 protected virtual PrimaryKeyAttribute GetPrimaryKey(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 return MetadataProvider.GetPrimaryKey(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 protected virtual bool GetSqlIgnore(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 return MetadataProvider.GetSqlIgnore(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 protected virtual string GetFieldName(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 return MetadataProvider.GetFieldName(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 protected virtual string GetFieldStorage(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 return MetadataProvider.GetFieldStorage(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 protected virtual bool GetInheritanceDiscriminator(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 return MetadataProvider.GetInheritanceDiscriminator(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 protected virtual bool GetTrimmable(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 return MetadataProvider.GetTrimmable(Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 protected virtual object GetNullValue(MemberAccessor memberAccessor, bool isNullable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 if (isNullable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 return MetadataProvider.GetNullValue(MappingSchema, Extension, memberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539 return MappingSchema.GetNullValue(memberAccessor.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 protected virtual Association GetAssociation(MemberAccessor memberAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 return MetadataProvider.GetAssociation(Extension, memberAccessor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 protected virtual InheritanceMappingAttribute[] GetInheritanceMapping()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 return MetadataProvider.GetInheritanceMapping(_typeAccessor.OriginalType, Extension);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 #region IObjectMappper Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 public virtual object CreateInstance()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 return _typeAccessor.CreateInstanceEx();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 public virtual object CreateInstance(InitContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 return _typeAccessor.CreateInstanceEx(context);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568 #region IMapDataSource Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 public override int Count
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 get { return _members.Count; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 public override Type GetFieldType(int index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 return _members[index].Type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 public override string GetName(int index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 return _members[index].Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585 public override object GetValue(object o, int index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587 return _members[index].GetValue(o);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 public override object GetValue(object o, string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592 MemberMapper mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594 lock (_nameToMember)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 if (!_nameToMember.TryGetValue(name, out mm))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596 mm = this[name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 return mm == null? null: mm.GetValue(o);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 public override bool IsNull (object o, int index) { return this[index].IsNull(o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 public override bool SupportsTypedValues(int index) { return this[index].SupportsValue; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605 // Simple type getters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 public override SByte GetSByte (object o, int index) { return this[index].GetSByte (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609 public override Int16 GetInt16 (object o, int index) { return this[index].GetInt16 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610 public override Int32 GetInt32 (object o, int index) { return this[index].GetInt32 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 public override Int64 GetInt64 (object o, int index) { return this[index].GetInt64 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613 public override Byte GetByte (object o, int index) { return this[index].GetByte (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615 public override UInt16 GetUInt16 (object o, int index) { return this[index].GetUInt16 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 public override UInt32 GetUInt32 (object o, int index) { return this[index].GetUInt32 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 public override UInt64 GetUInt64 (object o, int index) { return this[index].GetUInt64 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 public override Boolean GetBoolean (object o, int index) { return this[index].GetBoolean (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 public override Char GetChar (object o, int index) { return this[index].GetChar (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 public override Single GetSingle (object o, int index) { return this[index].GetSingle (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 public override Double GetDouble (object o, int index) { return this[index].GetDouble (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 public override Decimal GetDecimal (object o, int index) { return this[index].GetDecimal (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 public override Guid GetGuid (object o, int index) { return this[index].GetGuid (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 public override DateTime GetDateTime(object o, int index) { return this[index].GetDateTime(o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 public override DateTimeOffset GetDateTimeOffset(object o, int index) { return this[index].GetDateTimeOffset(o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630 // Nullable type getters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633 public override SByte? GetNullableSByte (object o, int index) { return this[index].GetNullableSByte (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634 public override Int16? GetNullableInt16 (object o, int index) { return this[index].GetNullableInt16 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 public override Int32? GetNullableInt32 (object o, int index) { return this[index].GetNullableInt32 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636 public override Int64? GetNullableInt64 (object o, int index) { return this[index].GetNullableInt64 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 public override Byte? GetNullableByte (object o, int index) { return this[index].GetNullableByte (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 public override UInt16? GetNullableUInt16 (object o, int index) { return this[index].GetNullableUInt16 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 public override UInt32? GetNullableUInt32 (object o, int index) { return this[index].GetNullableUInt32 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644 public override UInt64? GetNullableUInt64 (object o, int index) { return this[index].GetNullableUInt64 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 public override Boolean? GetNullableBoolean (object o, int index) { return this[index].GetNullableBoolean (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 public override Char? GetNullableChar (object o, int index) { return this[index].GetNullableChar (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648 public override Single? GetNullableSingle (object o, int index) { return this[index].GetNullableSingle (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 public override Double? GetNullableDouble (object o, int index) { return this[index].GetNullableDouble (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650 public override Decimal? GetNullableDecimal (object o, int index) { return this[index].GetNullableDecimal (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 public override Guid? GetNullableGuid (object o, int index) { return this[index].GetNullableGuid (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652 public override DateTime? GetNullableDateTime(object o, int index) { return this[index].GetNullableDateTime(o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 public override DateTimeOffset? GetNullableDateTimeOffset(object o, int index) { return this[index].GetNullableDateTimeOffset(o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657 // SQL type getters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659 public override SqlByte GetSqlByte (object o, int index) { return this[index].GetSqlByte (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660 public override SqlInt16 GetSqlInt16 (object o, int index) { return this[index].GetSqlInt16 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661 public override SqlInt32 GetSqlInt32 (object o, int index) { return this[index].GetSqlInt32 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662 public override SqlInt64 GetSqlInt64 (object o, int index) { return this[index].GetSqlInt64 (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663 public override SqlSingle GetSqlSingle (object o, int index) { return this[index].GetSqlSingle (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664 public override SqlBoolean GetSqlBoolean (object o, int index) { return this[index].GetSqlBoolean (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665 public override SqlDouble GetSqlDouble (object o, int index) { return this[index].GetSqlDouble (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666 public override SqlDateTime GetSqlDateTime(object o, int index) { return this[index].GetSqlDateTime(o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667 public override SqlDecimal GetSqlDecimal (object o, int index) { return this[index].GetSqlDecimal (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668 public override SqlMoney GetSqlMoney (object o, int index) { return this[index].GetSqlMoney (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669 public override SqlGuid GetSqlGuid (object o, int index) { return this[index].GetSqlGuid (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670 public override SqlString GetSqlString (object o, int index) { return this[index].GetSqlString (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676 #region IMapDataDestination Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 public override int GetOrdinal(string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 MemberMapper mm;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682 lock (_nameToMember)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683 if (!_nameToMember.TryGetValue(name, out mm))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684 mm = this[name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686 return mm == null? -1: mm.Ordinal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
687 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
688
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
689 public override void SetValue(object o, int index, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
690 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
691 _members[index].SetValue(o, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
692 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
693
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
694 public override void SetValue(object o, string name, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
695 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
696 SetValue(o, GetOrdinal(name), value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
697 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
698
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
699 public override void SetNull (object o, int index) { this[index].SetNull (o); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
700
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
701 // Simple types setters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
702 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
703 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
704 public override void SetSByte (object o, int index, SByte value) { this[index].SetSByte (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
705 public override void SetInt16 (object o, int index, Int16 value) { this[index].SetInt16 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
706 public override void SetInt32 (object o, int index, Int32 value) { this[index].SetInt32 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
707 public override void SetInt64 (object o, int index, Int64 value) { this[index].SetInt64 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
708
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
709 public override void SetByte (object o, int index, Byte value) { this[index].SetByte (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
710 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
711 public override void SetUInt16 (object o, int index, UInt16 value) { this[index].SetUInt16 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
712 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
713 public override void SetUInt32 (object o, int index, UInt32 value) { this[index].SetUInt32 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
714 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
715 public override void SetUInt64 (object o, int index, UInt64 value) { this[index].SetUInt64 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
716
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
717 public override void SetBoolean (object o, int index, Boolean value) { this[index].SetBoolean (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
718 public override void SetChar (object o, int index, Char value) { this[index].SetChar (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
719 public override void SetSingle (object o, int index, Single value) { this[index].SetSingle (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
720 public override void SetDouble (object o, int index, Double value) { this[index].SetDouble (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
721 public override void SetDecimal (object o, int index, Decimal value) { this[index].SetDecimal (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
722 public override void SetGuid (object o, int index, Guid value) { this[index].SetGuid (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
723 public override void SetDateTime(object o, int index, DateTime value) { this[index].SetDateTime(o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
724 public override void SetDateTimeOffset(object o, int index, DateTimeOffset value) { this[index].SetDateTimeOffset(o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
725
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
726 // Simple types setters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
727 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
728 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
729 public override void SetNullableSByte (object o, int index, SByte? value) { this[index].SetNullableSByte (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
730 public override void SetNullableInt16 (object o, int index, Int16? value) { this[index].SetNullableInt16 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
731 public override void SetNullableInt32 (object o, int index, Int32? value) { this[index].SetNullableInt32 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
732 public override void SetNullableInt64 (object o, int index, Int64? value) { this[index].SetNullableInt64 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
733
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
734 public override void SetNullableByte (object o, int index, Byte? value) { this[index].SetNullableByte (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
735 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
736 public override void SetNullableUInt16 (object o, int index, UInt16? value) { this[index].SetNullableUInt16 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
737 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
738 public override void SetNullableUInt32 (object o, int index, UInt32? value) { this[index].SetNullableUInt32 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
739 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
740 public override void SetNullableUInt64 (object o, int index, UInt64? value) { this[index].SetNullableUInt64 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
741
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
742 public override void SetNullableBoolean (object o, int index, Boolean? value) { this[index].SetNullableBoolean (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
743 public override void SetNullableChar (object o, int index, Char? value) { this[index].SetNullableChar (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
744 public override void SetNullableSingle (object o, int index, Single? value) { this[index].SetNullableSingle (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
745 public override void SetNullableDouble (object o, int index, Double? value) { this[index].SetNullableDouble (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
746 public override void SetNullableDecimal (object o, int index, Decimal? value) { this[index].SetNullableDecimal (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
747 public override void SetNullableGuid (object o, int index, Guid? value) { this[index].SetNullableGuid (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
748 public override void SetNullableDateTime(object o, int index, DateTime? value) { this[index].SetNullableDateTime(o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
749 public override void SetNullableDateTimeOffset(object o, int index, DateTimeOffset? value) { this[index].SetNullableDateTimeOffset(o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
750
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
751 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
752
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
753 // SQL type setters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
754 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
755 public override void SetSqlByte (object o, int index, SqlByte value) { this[index].SetSqlByte (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
756 public override void SetSqlInt16 (object o, int index, SqlInt16 value) { this[index].SetSqlInt16 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
757 public override void SetSqlInt32 (object o, int index, SqlInt32 value) { this[index].SetSqlInt32 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
758 public override void SetSqlInt64 (object o, int index, SqlInt64 value) { this[index].SetSqlInt64 (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
759 public override void SetSqlSingle (object o, int index, SqlSingle value) { this[index].SetSqlSingle (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
760 public override void SetSqlBoolean (object o, int index, SqlBoolean value) { this[index].SetSqlBoolean (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
761 public override void SetSqlDouble (object o, int index, SqlDouble value) { this[index].SetSqlDouble (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
762 public override void SetSqlDateTime(object o, int index, SqlDateTime value) { this[index].SetSqlDateTime(o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
763 public override void SetSqlDecimal (object o, int index, SqlDecimal value) { this[index].SetSqlDecimal (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
764 public override void SetSqlMoney (object o, int index, SqlMoney value) { this[index].SetSqlMoney (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
765 public override void SetSqlGuid (object o, int index, SqlGuid value) { this[index].SetSqlGuid (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
766 public override void SetSqlString (object o, int index, SqlString value) { this[index].SetSqlString (o, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
767
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
768 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
769
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
770 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
771
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
772 #region IEnumerable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
773
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
774 public IEnumerator GetEnumerator()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
775 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
776 return _members.GetEnumerator();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
777 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
778
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
779 IEnumerator<MemberMapper> IEnumerable<MemberMapper>.GetEnumerator()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
780 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
781 return _members.GetEnumerator();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
782 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
783
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
784 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
785 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
786 }