123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- using Ant.Core;
- using Ant.Core.Emit;
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- namespace Ant.Mapper
- {
- public class EntityConstructor
- {
- EntityConstructor(ConstructorInfo constructorInfo)
- {
- this.ConstructorInfo = constructorInfo;
- this.Init();
- }
- void Init()
- {
- ConstructorInfo constructor = this.ConstructorInfo;
- Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> fn = DelegateGenerator.CreateObjectGenerator(constructor);
- this.InstanceCreator = fn;
- }
- public ConstructorInfo ConstructorInfo { get; private set; }
- public Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> InstanceCreator { get; private set; }
- static readonly System.Collections.Concurrent.ConcurrentDictionary<ConstructorInfo, EntityConstructor> InstanceCache = new System.Collections.Concurrent.ConcurrentDictionary<ConstructorInfo, EntityConstructor>();
- public static EntityConstructor GetInstance(ConstructorInfo constructorInfo)
- {
- EntityConstructor instance;
- if (!InstanceCache.TryGetValue(constructorInfo, out instance))
- {
- lock (constructorInfo)
- {
- if (!InstanceCache.TryGetValue(constructorInfo, out instance))
- {
- instance = new EntityConstructor(constructorInfo);
- InstanceCache.GetOrAdd(constructorInfo, instance);
- }
- }
- }
- return instance;
- }
- }
- public class ReaderOrdinalEnumerator
- {
- public static readonly MethodInfo NextMethodInfo;
- static ReaderOrdinalEnumerator()
- {
- MethodInfo method = typeof(ReaderOrdinalEnumerator).GetMethod("Next");
- NextMethodInfo = method;
- }
- List<int> _readerOrdinals;
- int _next;
- int _currentOrdinal;
- public int CurrentOrdinal { get { return this._currentOrdinal; } }
- public ReaderOrdinalEnumerator(List<int> readerOrdinals)
- {
- this._readerOrdinals = readerOrdinals;
- this._next = 0;
- this._currentOrdinal = -1;
- }
- public int Next()
- {
- this._currentOrdinal = this._readerOrdinals[this._next];
- this._next++;
- return this._currentOrdinal;
- }
- public void Reset()
- {
- this._next = 0;
- this._currentOrdinal = -1;
- }
- }
- public class ObjectActivatorEnumerator
- {
- List<IObjectActivator> _objectActivators;
- int _next;
- public static readonly MethodInfo NextMethodInfo;
- static ObjectActivatorEnumerator()
- {
- MethodInfo method = typeof(ObjectActivatorEnumerator).GetMethod("Next");
- NextMethodInfo = method;
- }
- public ObjectActivatorEnumerator(List<IObjectActivator> objectActivators)
- {
- this._objectActivators = objectActivators;
- this._next = 0;
- }
- public IObjectActivator Next()
- {
- IObjectActivator ret = this._objectActivators[this._next];
- this._next++;
- return ret;
- }
- public void Reset()
- {
- this._next = 0;
- }
- }
- }
|