コード例 #1
0
        public T Generate <T>(Type bindingType) where T : class
        {
            string      storedProcedureName;
            MethodInfo  methodInfo;
            CommandType commandType   = this.ParsingAttributes(bindingType, out storedProcedureName, out methodInfo);
            Type        reflectedType = methodInfo.ReflectedType;

            ParameterInfo[] parameters    = methodInfo.GetParameters();
            Type            parameterType = methodInfo.ReturnParameter.ParameterType;

            Type[] array = new Type[parameters.Length + 1];
            array[0] = typeof(string);
            for (int i = 0; i < parameters.Length; i++)
            {
                array[i + 1] = parameters[i].ParameterType;
            }
            DynamicMethod dynamicMethod          = new DynamicMethod(string.Format("{0}.InternalQueryExecute", bindingType.Namespace), parameterType, array, bindingType.Module, true);
            ILGenerator   ilgenerator            = dynamicMethod.GetILGenerator();
            LocalBuilder  localBuilder           = SqlProcedureLinker.NewSqlconnection(ilgenerator);
            LocalBuilder  localBuilder2          = SqlProcedureLinker.NewSqlCommand(ilgenerator, storedProcedureName, localBuilder);
            LocalBuilder  sqlParameterCollection = SqlProcedureLinker.InitSqlCommand(ilgenerator, localBuilder2);
            LocalBuilder  localBuilder3          = SqlProcedureLinker.NewInstance2(ilgenerator, bindingType);

            SqlProcedureLinker.BindingParameters(ilgenerator, bindingType, localBuilder3, parameters, sqlParameterCollection);
            if (parameterType.Equals(typeof(void)))
            {
                ilgenerator.Emit(OpCodes.Ldloc, localBuilder2);
                ilgenerator.Emit(OpCodes.Call, typeof(SqlCommand).GetMethod("ExecuteNonQuery", Type.EmptyTypes));
                ilgenerator.Emit(OpCodes.Pop);
            }
            else if (parameterType.Equals(bindingType))
            {
                LocalBuilder localBuilder4 = SqlProcedureLinker.NewSqlDataReader(ilgenerator, localBuilder2);
                SqlProcedureLinker.ExecuteReader(ilgenerator, bindingType, localBuilder3, localBuilder4, 0);
                ilgenerator.Emit(OpCodes.Ldloc, localBuilder4);
                ilgenerator.EmitCall(OpCodes.Call, typeof(SqlDataReader).GetMethod("Close", Type.EmptyTypes), null);
            }
            else
            {
                ilgenerator.Emit(OpCodes.Ldloc, localBuilder2);
                ilgenerator.Emit(OpCodes.Call, typeof(SqlCommand).GetMethod("ExecuteScalar", Type.EmptyTypes));
                ilgenerator.Emit(OpCodes.Unbox_Any, parameterType);
            }
            SqlProcedureLinker.GettingParameters(ilgenerator, parameters, sqlParameterCollection);
            SqlProcedureLinker.GettingReturnValue(ilgenerator, bindingType, localBuilder3, sqlParameterCollection);
            ilgenerator.Emit(OpCodes.Ldloc, localBuilder);
            ilgenerator.Emit(OpCodes.Call, typeof(SqlConnection).GetMethod("Close"));
            if (parameterType.Equals(bindingType))
            {
                ilgenerator.Emit(OpCodes.Ldloc, localBuilder3);
            }
            ilgenerator.Emit(OpCodes.Ret);
            T t = dynamicMethod.CreateDelegate(reflectedType, this.connectionString) as T;

            if (t == null)
            {
                throw new ArgumentException(string.Format("Generic delegator type-casting occurs error: {0}", typeof(T).Name));
            }
            return(t);
        }