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); }
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 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); }
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); }
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); }