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