private MethodInfo GetMethod(string name, Routine routine, bool[] hasConnection, bool returnsTable) { MethodInfo[] methods = this.GetMethods(name); int i = -1; for (int j = 0; j < methods.Length; j++) { int num4; int num3 = 0; hasConnection[0] = false; MethodInfo info = methods[j]; ParameterInfo[] parameters = info.GetParameters(); if ((parameters.Length != 0) && parameters[0].ParameterType.Equals(typeof(DbConnection))) { num3 = 1; hasConnection[0] = true; } if ((parameters.Length - num3) != routine.ParameterTypes.Length) { continue; } if (returnsTable) { if (typeof(IEnumerable).IsAssignableFrom(info.ReturnType)) { goto Label_00AB; } continue; } SqlType parameterSqlType = Types.GetParameterSqlType(methods[j].ReturnType); if ((parameterSqlType == null) || (parameterSqlType.TypeCode != routine.ReturnType.TypeCode)) { continue; } Label_00AB: num4 = 0; while (num4 < routine.ParameterTypes.Length) { bool flag = false; ParameterInfo info2 = parameters[num4 + num3]; Type parameterType = info2.ParameterType; if (parameterType.IsArray && !typeof(byte[]).Equals(parameterType)) { parameterType = parameterType.GetElementType(); if (parameterType.IsPrimitive) { info = null; break; } flag = true; } SqlType type3 = Types.GetParameterSqlType(parameterType); if (type3 == null) { info = null; break; } ColumnSchema parameter = routine.GetParameter(num4); if (parameter.GetParameterMode() == 1) { if (!info2.IsOut && !parameterType.IsByRef) { goto Label_0183; } info = null; break; } if (parameter.GetParameterMode() == 4) { if (info2.IsOut && parameterType.IsByRef) { goto Label_0183; } info = null; break; } if ((parameter.GetParameterMode() == 2) && !parameterType.IsByRef) { info = null; break; } Label_0183: parameter.SetNullable(!parameters[j].ParameterType.IsPrimitive); bool flag2 = routine.ParameterTypes[num4].TypeComparisonGroup == type3.TypeComparisonGroup; if (flag2 && routine.ParameterTypes[num4].IsNumberType()) { flag2 = routine.ParameterTypes[num4].TypeCode == type3.TypeCode; } if (flag && (routine.GetParameter(num4).ParameterMode == 1)) { flag2 = false; } if (!flag2) { info = null; if ((num4 + num3) > i) { i = num4 + num3; } break; } num4++; } if (info != null) { for (int k = 0; k < routine.ParameterTypes.Length; k++) { routine.GetParameter(k).SetNullable(!parameters[k + num3].ParameterType.IsPrimitive); } return(info); } } if (i >= 0) { ColumnSchema parameter = routine.GetParameter(i); throw Error.GetError(0x1785, parameter.GetNameString()); } return(null); }