Beispiel #1
0
        public static Type CreateMRMType(MemberInfo propertyOrField)
        {
            Type entityType = propertyOrField.DeclaringType;

            Assembly assembly = entityType.GetAssembly();

            ModuleBuilder moduleBuilder;

            if (!_moduleBuilders.TryGetValue(assembly, out moduleBuilder))
            {
                lock (assembly)
                {
                    if (!_moduleBuilders.TryGetValue(assembly, out moduleBuilder))
                    {
                        var assemblyName = new AssemblyName(String.Format(CultureInfo.InvariantCulture, "ChloeMRMs-{0}", assembly.FullName));
                        assemblyName.Version = new Version(1, 0, 0, 0);

                        AssemblyBuilder assemblyBuilder;
#if NETCORE
                        assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
#elif NETFX
                        assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
#endif
                        moduleBuilder = assemblyBuilder.DefineDynamicModule("ChloeMRMModule");

                        _moduleBuilders.Add(assembly, moduleBuilder);
                    }
                }
            }

            TypeAttributes typeAttributes = TypeAttributes.Class | TypeAttributes.NotPublic | TypeAttributes.Sealed;
            TypeBuilder    tb             = moduleBuilder.DefineType(string.Format("Chloe.Mapper.MRMs.{0}_{1}_{2}", entityType.Name, propertyOrField.Name, Guid.NewGuid().ToString("N").Substring(0, 5) + System.Threading.Interlocked.Increment(ref _sequenceNumber).ToString()), typeAttributes, null, new Type[] { typeof(IMRM) });

            tb.DefineDefaultConstructor(MethodAttributes.Public | MethodAttributes.SpecialName);

            MethodBuilder methodBuilder = tb.DefineMethod("Map", MethodAttributes.Public | MethodAttributes.Virtual, CallingConventions.HasThis, typeof(void), new Type[] { typeof(object), typeof(IDataReader), typeof(int) });

            ILGenerator il = methodBuilder.GetILGenerator();

            int parameStartIndex = 1;

            il.Emit(OpCodes.Ldarg_S, parameStartIndex);                //将第一个参数 object 对象加载到栈顶
            il.Emit(OpCodes.Castclass, propertyOrField.DeclaringType); //将 object 对象转换为强类型对象 此时栈顶为强类型的对象

            var readerMethod = DataReaderConstant.GetReaderMethod(ReflectionExtension.GetMemberType(propertyOrField));

            //ordinal
            il.Emit(OpCodes.Ldarg_S, parameStartIndex + 1); //加载参数DataReader
            il.Emit(OpCodes.Ldarg_S, parameStartIndex + 2); //加载 read ordinal
            il.EmitCall(OpCodes.Call, readerMethod, null);  //调用对应的 readerMethod 得到 value  reader.Getxx(ordinal);  此时栈顶为 value

            EmitHelper.SetValueIL(il, propertyOrField);     // object.XX = value; 此时栈顶为空

            il.Emit(OpCodes.Ret);                           // 即可 return

            Type t = tb.CreateType();

            return(t);
        }
        public static Func <IDataReader, int, object> CreateMappingTypeGenerator(Type type)
        {
            var pExp_reader        = Expression.Parameter(typeof(IDataReader), "reader");
            var pExp_readerOrdinal = Expression.Parameter(typeof(int), "readerOrdinal");

            var readerMethod = DataReaderConstant.GetReaderMethod(type);
            var getValue     = Expression.Call(readerMethod, pExp_reader, pExp_readerOrdinal);
            var body         = Expression.Convert(getValue, typeof(object));

            Func <IDataReader, int, object> ret = Expression.Lambda <Func <IDataReader, int, object> >(body, pExp_reader, pExp_readerOrdinal).Compile();

            return(ret);
        }
Beispiel #3
0
        public static Func <IDataReader, int, object> CreateDataReaderGetValueHandler(Type valueType)
        {
            var reader  = Expression.Parameter(typeof(IDataReader), "reader");
            var ordinal = Expression.Parameter(typeof(int), "ordinal");

            var readerMethod = DataReaderConstant.GetReaderMethod(valueType);

            var getValue = Expression.Call(null, readerMethod, reader, ordinal);
            var toObject = Expression.Convert(getValue, typeof(object));

            var lambda = Expression.Lambda <Func <IDataReader, int, object> >(toObject, reader, ordinal);
            var del    = lambda.Compile();

            return(del);
        }
        public EntityRowComparer(List <Tuple <PropertyDescriptor, int> > keys)
        {
            List <Tuple <PropertyDescriptor, int, IDbValueReader> > keyList = new List <Tuple <PropertyDescriptor, int, IDbValueReader> >(keys.Count);

            for (int i = 0; i < keys.Count; i++)
            {
                var            tuple         = keys[i];
                IDbValueReader dbValueReader = DataReaderConstant.GetDbValueReader(tuple.Item1.PropertyType);

                keyList.Add(new Tuple <PropertyDescriptor, int, IDbValueReader>(tuple.Item1, tuple.Item2, dbValueReader));
            }

            this._keys      = keyList;
            this._keyValues = new object[keys.Count];
        }
Beispiel #5
0
        public static Action <object, IDataReader, int> CreateSetValueFromReaderDelegate(MemberInfo member)
        {
            var p        = Expression.Parameter(typeof(object), "instance");
            var instance = Expression.Convert(p, member.DeclaringType);
            var reader   = Expression.Parameter(typeof(IDataReader), "reader");
            var ordinal  = Expression.Parameter(typeof(int), "ordinal");

            var readerMethod = DataReaderConstant.GetReaderMethod(member.GetMemberType());
            var getValue     = Expression.Call(null, readerMethod, reader, ordinal);
            var assign       = ExpressionExtension.Assign(member, instance, getValue);
            var lambda       = Expression.Lambda <Action <object, IDataReader, int> >(assign, p, reader, ordinal);

            Action <object, IDataReader, int> del = lambda.Compile();

            return(del);
        }
        static Action <TEntity, IDataReader> GetMapper <TEntity>(PrimitivePropertyDescriptor propertyDescriptor, int ordinal)
        {
            var dbValueReader = DataReaderConstant.GetDbValueReader(propertyDescriptor.PropertyType);

            Action <TEntity, IDataReader> mapper = (TEntity entity, IDataReader reader) =>
            {
                object value = dbValueReader.GetValue(reader, ordinal);
                if (value == null || value == DBNull.Value)
                {
                    throw new ChloeException($"Unable to get the {propertyDescriptor.Property.Name} value from data reader.");
                }

                propertyDescriptor.SetValue(entity, value);
            };

            return(mapper);
        }
        public static Func <IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> CreateObjectGenerator(ConstructorInfo constructor)
        {
            Utils.CheckNull(constructor);

            Func <IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> ret = null;

            var pExp_reader = Expression.Parameter(typeof(IDataReader), "reader");
            var pExp_readerOrdinalEnumerator   = Expression.Parameter(typeof(ReaderOrdinalEnumerator), "readerOrdinalEnumerator");
            var pExp_objectActivatorEnumerator = Expression.Parameter(typeof(ObjectActivatorEnumerator), "objectActivatorEnumerator");

            ParameterInfo[]   parameters = constructor.GetParameters();
            List <Expression> arguments  = new List <Expression>(parameters.Length);

            foreach (ParameterInfo parameter in parameters)
            {
                if (MappingTypeSystem.IsMappingType(parameter.ParameterType))
                {
                    var readerMethod = DataReaderConstant.GetReaderMethod(parameter.ParameterType);
                    //int ordinal = readerOrdinalEnumerator.Next();
                    var readerOrdinal = Expression.Call(pExp_readerOrdinalEnumerator, ReaderOrdinalEnumerator.MethodOfNext);
                    //DataReaderExtensions.GetValue(reader,readerOrdinal)
                    var getValue = Expression.Call(readerMethod, pExp_reader, readerOrdinal);
                    arguments.Add(getValue);
                }
                else
                {
                    //IObjectActivator oa = objectActivatorEnumerator.Next();
                    var oa = Expression.Call(pExp_objectActivatorEnumerator, ObjectActivatorEnumerator.MethodOfNext);
                    //object obj = oa.CreateInstance(IDataReader reader);
                    var entity = Expression.Call(oa, typeof(IObjectActivator).GetMethod("CreateInstance"), pExp_reader);
                    //(T)entity;
                    var val = Expression.Convert(entity, parameter.ParameterType);
                    arguments.Add(val);
                }
            }

            var body = Expression.New(constructor, arguments);

            ret = Expression.Lambda <Func <IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> >(body, pExp_reader, pExp_readerOrdinalEnumerator, pExp_objectActivatorEnumerator).Compile();

            return(ret);
        }
        public static Action <object, IDataReader, int> CreateSetValueFromReaderDelegate(MemberInfo member)
        {
            Action <object, IDataReader, int> del = null;

            DynamicMethod dm = new DynamicMethod("SetValueFromReader_" + Guid.NewGuid().ToString("N"), null, new Type[] { typeof(object), typeof(IDataReader), typeof(int) }, true);
            ILGenerator   il = dm.GetILGenerator();

            il.Emit(OpCodes.Ldarg_S, 0);                      //将第一个参数 object 对象加载到栈顶
            il.Emit(OpCodes.Castclass, member.DeclaringType); //将 object 对象转换为强类型对象 此时栈顶为强类型的对象

            var readerMethod = DataReaderConstant.GetReaderMethod(member.GetMemberType());

            //ordinal
            il.Emit(OpCodes.Ldarg_S, 1);                   //加载参数DataReader
            il.Emit(OpCodes.Ldarg_S, 2);                   //加载 read ordinal
            il.EmitCall(OpCodes.Call, readerMethod, null); //调用对应的 readerMethod 得到 value  reader.Getxx(ordinal);  此时栈顶为 value

            EmitHelper.SetValueIL(il, member);             // object.XX = value; 此时栈顶为空

            il.Emit(OpCodes.Ret);                          // 即可 return

            del = (Action <object, IDataReader, int>)dm.CreateDelegate(typeof(Action <object, IDataReader, int>));
            return(del);
        }
Beispiel #9
0
 public PrimitiveObjectActivator(Type primitiveType, int readerOrdinal)
 {
     this._primitiveType = primitiveType;
     this._readerOrdinal = readerOrdinal;
     this._dbValueReader = DataReaderConstant.GetDbValueReader(primitiveType);
 }
Beispiel #10
0
        public static Type CreateMRMType(MemberInfo member)
        {
            if (member.MemberType != MemberTypes.Property && member.MemberType != MemberTypes.Field)
            {
                throw new NotSupportedException();
            }

            Type entityType = member.DeclaringType;

            TypeInfo typeInfo = entityType.GetTypeInfo();

            Assembly assembly = typeInfo.Assembly;

            ModuleBuilder moduleBuilder;

            if (!_moduleBuilders.TryGetValue(assembly, out moduleBuilder))
            {
                lock (assembly)
                {
                    if (!_moduleBuilders.TryGetValue(assembly, out moduleBuilder))
                    {
                        var assemblyName =
                            new AssemblyName(String.Format(CultureInfo.InvariantCulture, "ChloeMRMs-{0}", assembly.FullName));
                        assemblyName.Version = new Version(1, 0, 0, 0);

                        AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
                        moduleBuilder = assemblyBuilder.DefineDynamicModule("ChloeMRMModule");

                        _moduleBuilders.Add(assembly, moduleBuilder);
                    }
                }
            }

            TypeAttributes typeAttributes = TypeAttributes.Class | TypeAttributes.NotPublic | TypeAttributes.Sealed;
            TypeBuilder    tb             = moduleBuilder.DefineType(string.Format("Chloe.Core.Mapper.MRMs.{0}_{1}_{2}", entityType.Name, member.Name, Guid.NewGuid().ToString("N")), typeAttributes, null, new Type[] { typeof(IMRM) });

            tb.DefineDefaultConstructor(MethodAttributes.Public | MethodAttributes.SpecialName);

            MethodBuilder methodBuilder = tb.DefineMethod("Map", MethodAttributes.Public | MethodAttributes.Virtual, CallingConventions.HasThis, typeof(void), new Type[] { typeof(object), typeof(IDataReader), typeof(int) });

            ILGenerator il = methodBuilder.GetILGenerator();

            int parameStartIndex = 1;

            il.Emit(OpCodes.Ldarg_S, parameStartIndex);       //将第一个参数 object 对象加载到栈顶
            il.Emit(OpCodes.Castclass, member.DeclaringType); //将 object 对象转换为强类型对象 此时栈顶为强类型的对象

            var readerMethod = DataReaderConstant.GetReaderMethod(ReflectionExtensions.GetPropertyOrFieldType(member));

            //ordinal
            il.Emit(OpCodes.Ldarg_S, parameStartIndex + 1); //加载参数DataReader
            il.Emit(OpCodes.Ldarg_S, parameStartIndex + 2); //加载 read ordinal
            il.EmitCall(OpCodes.Call, readerMethod, null);  //调用对应的 readerMethod 得到 value  reader.Getxx(ordinal);  此时栈顶为 value

            EmitHelper.SetValueIL(il, member);              // object.XX = value; 此时栈顶为空

            il.Emit(OpCodes.Ret);                           // 即可 return

            Type t = tb.CreateTypeInfo().AsType();

            return(t);
        }