public static Type Compile(Type t, ModuleBuilder module) { var c = new EnumeratorCompiler(t, module); c.EmitConstructor(); c.EmitDispose(); c.EmitReset(); c.EmitMoveNext(t); c.EmitCurrent(t); c.EmitCurrent(typeof(object)); return(c._tBuilder.CreateType()); }
void CompileMethod(MethodCompileInfo method, MethodBuilder nMethod, ModuleBuilder mb) { var siDbCommandExecuteNonQuery = typeof(IDbCommand).GetMethod("ExecuteNonQuery"); var siDbCommandExecuteScalar = typeof(IDbCommand).GetMethod("ExecuteScalar"); var siDbCommandExecuteReader = typeof(IDbCommand).GetMethod("ExecuteReader", new Type[0]); var il = nMethod.GetILGenerator(); var i = 0; foreach (var parm in method.Parms) { il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldfld, method.PrsField); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Ldelem_Ref); il.Emit(OpCodes.Ldarg, i + 1); if (parm.ParameterType.IsValueType) { il.Emit(OpCodes.Box, parm.ParameterType); } il.Emit(OpCodes.Callvirt, _siDataParameterSetValue); i++; } il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldfld, method.CmdField); if (method.RetEnumType != null) { var enumeratorT = EnumeratorCompiler.Compile(method.RetEnumType, mb); il.Emit(OpCodes.Callvirt, siDbCommandExecuteReader); il.Emit(OpCodes.Newobj, enumeratorT.GetConstructor(new[] { typeof(IDataReader) })); il.Emit(OpCodes.Ret); } else { switch (method.Infos.ReturnType.Name) { case "Void": il.Emit(OpCodes.Callvirt, siDbCommandExecuteNonQuery); il.Emit(OpCodes.Pop); il.Emit(OpCodes.Ret); break; case "Object": il.Emit(OpCodes.Callvirt, siDbCommandExecuteScalar); il.Emit(OpCodes.Ret); break; case "IDataReader": il.Emit(OpCodes.Callvirt, siDbCommandExecuteReader); il.Emit(OpCodes.Ret); break; default: throw new ArgumentException("Method " + method.Infos.Name + " returns incompatible type " + method.Infos.ReturnType.Name); } } }