EntityConstructor.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using Ant.Core;
  2. using Ant.Core.Emit;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Text;
  9. namespace Ant.Mapper
  10. {
  11. public class EntityConstructor
  12. {
  13. EntityConstructor(ConstructorInfo constructorInfo)
  14. {
  15. this.ConstructorInfo = constructorInfo;
  16. this.Init();
  17. }
  18. void Init()
  19. {
  20. ConstructorInfo constructor = this.ConstructorInfo;
  21. Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> fn = DelegateGenerator.CreateObjectGenerator(constructor);
  22. this.InstanceCreator = fn;
  23. }
  24. public ConstructorInfo ConstructorInfo { get; private set; }
  25. public Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> InstanceCreator { get; private set; }
  26. static readonly System.Collections.Concurrent.ConcurrentDictionary<ConstructorInfo, EntityConstructor> InstanceCache = new System.Collections.Concurrent.ConcurrentDictionary<ConstructorInfo, EntityConstructor>();
  27. public static EntityConstructor GetInstance(ConstructorInfo constructorInfo)
  28. {
  29. EntityConstructor instance;
  30. if (!InstanceCache.TryGetValue(constructorInfo, out instance))
  31. {
  32. lock (constructorInfo)
  33. {
  34. if (!InstanceCache.TryGetValue(constructorInfo, out instance))
  35. {
  36. instance = new EntityConstructor(constructorInfo);
  37. InstanceCache.GetOrAdd(constructorInfo, instance);
  38. }
  39. }
  40. }
  41. return instance;
  42. }
  43. }
  44. public class ReaderOrdinalEnumerator
  45. {
  46. public static readonly MethodInfo NextMethodInfo;
  47. static ReaderOrdinalEnumerator()
  48. {
  49. MethodInfo method = typeof(ReaderOrdinalEnumerator).GetMethod("Next");
  50. NextMethodInfo = method;
  51. }
  52. List<int> _readerOrdinals;
  53. int _next;
  54. int _currentOrdinal;
  55. public int CurrentOrdinal { get { return this._currentOrdinal; } }
  56. public ReaderOrdinalEnumerator(List<int> readerOrdinals)
  57. {
  58. this._readerOrdinals = readerOrdinals;
  59. this._next = 0;
  60. this._currentOrdinal = -1;
  61. }
  62. public int Next()
  63. {
  64. this._currentOrdinal = this._readerOrdinals[this._next];
  65. this._next++;
  66. return this._currentOrdinal;
  67. }
  68. public void Reset()
  69. {
  70. this._next = 0;
  71. this._currentOrdinal = -1;
  72. }
  73. }
  74. public class ObjectActivatorEnumerator
  75. {
  76. List<IObjectActivator> _objectActivators;
  77. int _next;
  78. public static readonly MethodInfo NextMethodInfo;
  79. static ObjectActivatorEnumerator()
  80. {
  81. MethodInfo method = typeof(ObjectActivatorEnumerator).GetMethod("Next");
  82. NextMethodInfo = method;
  83. }
  84. public ObjectActivatorEnumerator(List<IObjectActivator> objectActivators)
  85. {
  86. this._objectActivators = objectActivators;
  87. this._next = 0;
  88. }
  89. public IObjectActivator Next()
  90. {
  91. IObjectActivator ret = this._objectActivators[this._next];
  92. this._next++;
  93. return ret;
  94. }
  95. public void Reset()
  96. {
  97. this._next = 0;
  98. }
  99. }
  100. }