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());
        }
Exemple #2
0
        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);
                }
            }
        }