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