private void ReorderParams(int[] paramOrder, object[] vars, VBBinderState state)
 {
     int num = Math.Max(vars.GetUpperBound(0), paramOrder.GetUpperBound(0));
     state.m_OriginalParamOrder = new int[num + 1];
     int num3 = num;
     for (int i = 0; i <= num3; i++)
     {
         state.m_OriginalParamOrder[i] = paramOrder[i];
     }
 }
        public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, ref object ObjState)
        {
            int num;
            int[] numArray;
            Type type = null;
            bool flag;
            int num3;
            ParameterInfo info;
            int num4;
            int num5;
            Type elementType = null;
            int num8;
            ParameterInfo[] infoArray;
            int num9;
            Type parameterType = null;
            int num11;
            MethodBase base4;
            if ((match == null) || (match.Length == 0))
            {
                throw ExceptionUtils.VbMakeException(0x1b6);
            }
            if (((this.m_CachedMember != null) && (this.m_CachedMember.MemberType == MemberTypes.Method)) && ((match[0] != null) && (match[0].Name == this.m_CachedMember.Name)))
            {
                return (MethodBase) this.m_CachedMember;
            }
            bool isPropertySet = (bindingAttr & BindingFlags.SetProperty) != BindingFlags.Default;
            if ((names != null) && (names.Length == 0))
            {
                names = null;
            }
            int length = match.Length;
            if (length > 1)
            {
                int num25 = match.GetUpperBound(0);
                for (num5 = 0; num5 <= num25; num5++)
                {
                    base4 = match[num5];
                    if ((base4 != null) && !base4.IsHideBySig)
                    {
                        if (base4.IsVirtual)
                        {
                            if ((base4.Attributes & MethodAttributes.NewSlot) != MethodAttributes.PrivateScope)
                            {
                                int num26 = match.GetUpperBound(0);
                                for (int i = 0; i <= num26; i++)
                                {
                                    if (((num5 != i) && (match[i] != null)) && base4.DeclaringType.IsSubclassOf(match[i].DeclaringType))
                                    {
                                        match[i] = null;
                                        length--;
                                    }
                                }
                            }
                        }
                        else
                        {
                            int num27 = match.GetUpperBound(0);
                            for (int j = 0; j <= num27; j++)
                            {
                                if (((num5 != j) && (match[j] != null)) && base4.DeclaringType.IsSubclassOf(match[j].DeclaringType))
                                {
                                    match[j] = null;
                                    length--;
                                }
                            }
                        }
                    }
                }
            }
            int num2 = length;
            if (names != null)
            {
                int num28 = match.GetUpperBound(0);
                for (num5 = 0; num5 <= num28; num5++)
                {
                    base4 = match[num5];
                    if (base4 != null)
                    {
                        infoArray = base4.GetParameters();
                        num4 = infoArray.GetUpperBound(0);
                        if (isPropertySet)
                        {
                            num4--;
                        }
                        if (num4 >= 0)
                        {
                            info = infoArray[num4];
                            num8 = -1;
                            if (info.ParameterType.IsArray)
                            {
                                object[] customAttributes = info.GetCustomAttributes(typeof(ParamArrayAttribute), false);
                                if ((customAttributes != null) && (customAttributes.Length > 0))
                                {
                                    num8 = num4;
                                }
                                else
                                {
                                    num8 = -1;
                                }
                            }
                        }
                        int num29 = names.GetUpperBound(0);
                        for (int k = 0; k <= num29; k++)
                        {
                            int num30 = num4;
                            num9 = 0;
                            while (num9 <= num30)
                            {
                                if (Strings.StrComp(names[k], infoArray[num9].Name, CompareMethod.Text) == 0)
                                {
                                    if ((num9 == num8) && (length == 1))
                                    {
                                        throw ExceptionUtils.VbMakeExceptionEx(0x1be, Utils.GetResourceString("NamedArgumentOnParamArray"));
                                    }
                                    if (num9 == num8)
                                    {
                                        num9 = num4 + 1;
                                    }
                                    break;
                                }
                                num9++;
                            }
                            if (num9 > num4)
                            {
                                if (length == 1)
                                {
                                    throw new MissingMemberException(Utils.GetResourceString("Argument_InvalidNamedArg2", new string[] { names[k], this.CalledMethodName() }));
                                }
                                match[num5] = null;
                                length--;
                                break;
                            }
                        }
                    }
                }
            }
            int[] numArray2 = new int[(match.Length - 1) + 1];
            int upperBound = match.GetUpperBound(0);
            for (num5 = 0; num5 <= upperBound; num5++)
            {
                base4 = match[num5];
                if (base4 != null)
                {
                    num8 = -1;
                    infoArray = base4.GetParameters();
                    num4 = infoArray.GetUpperBound(0);
                    if (isPropertySet)
                    {
                        num4--;
                    }
                    if (num4 >= 0)
                    {
                        info = infoArray[num4];
                        if (info.ParameterType.IsArray)
                        {
                            object[] objArray3 = info.GetCustomAttributes(typeof(ParamArrayAttribute), false);
                            if ((objArray3 != null) && (objArray3.Length > 0))
                            {
                                num8 = num4;
                            }
                        }
                    }
                    numArray2[num5] = num8;
                    if ((num8 == -1) && (args.Length > infoArray.Length))
                    {
                        if (length == 1)
                        {
                            throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) }));
                        }
                        match[num5] = null;
                        length--;
                    }
                    int num14 = num4;
                    if (num8 != -1)
                    {
                        num14--;
                    }
                    if (args.Length < num14)
                    {
                        int num32 = num14 - 1;
                        int index = args.Length;
                        while (index <= num32)
                        {
                            if (infoArray[index].DefaultValue == DBNull.Value)
                            {
                                break;
                            }
                            index++;
                        }
                        if (index != num14)
                        {
                            if (length == 1)
                            {
                                throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) }));
                            }
                            match[num5] = null;
                            length--;
                        }
                    }
                }
            }
            object[] paramOrder = new object[(match.Length - 1) + 1];
            int num33 = match.GetUpperBound(0);
            for (num5 = 0; num5 <= num33; num5++)
            {
                base4 = match[num5];
                if (base4 != null)
                {
                    infoArray = base4.GetParameters();
                    if (args.Length > infoArray.Length)
                    {
                        numArray = new int[(args.Length - 1) + 1];
                    }
                    else
                    {
                        numArray = new int[(infoArray.Length - 1) + 1];
                    }
                    paramOrder[num5] = numArray;
                    if (names == null)
                    {
                        int num16 = args.GetUpperBound(0);
                        if (isPropertySet)
                        {
                            num16--;
                        }
                        int num34 = num16;
                        num = 0;
                        while (num <= num34)
                        {
                            if ((args[num] is Missing) && ((num > infoArray.GetUpperBound(0)) || infoArray[num].IsOptional))
                            {
                                numArray[num] = -1;
                            }
                            else
                            {
                                numArray[num] = num;
                            }
                            num++;
                        }
                        num16 = numArray.GetUpperBound(0);
                        int num35 = num16;
                        for (num = num; num <= num35; num++)
                        {
                            numArray[num] = -1;
                        }
                        if (isPropertySet)
                        {
                            numArray[num16] = args.GetUpperBound(0);
                        }
                    }
                    else
                    {
                        Exception exception = this.CreateParamOrder(isPropertySet, numArray, base4.GetParameters(), args, names);
                        if (exception != null)
                        {
                            if (length == 1)
                            {
                                throw exception;
                            }
                            match[num5] = null;
                            length--;
                        }
                    }
                }
            }
            Type[] argTypes = new Type[(args.Length - 1) + 1];
            int num36 = args.GetUpperBound(0);
            num = 0;
            while (num <= num36)
            {
                if (args[num] != null)
                {
                    argTypes[num] = args[num].GetType();
                }
                num++;
            }
            int num37 = match.GetUpperBound(0);
            for (num5 = 0; num5 <= num37; num5++)
            {
                base4 = match[num5];
                if (base4 != null)
                {
                    infoArray = base4.GetParameters();
                    numArray = (int[]) paramOrder[num5];
                    num4 = numArray.GetUpperBound(0);
                    if (isPropertySet)
                    {
                        num4--;
                    }
                    num8 = numArray2[num5];
                    if (num8 != -1)
                    {
                        elementType = infoArray[num8].ParameterType.GetElementType();
                    }
                    else if (numArray.Length > infoArray.Length)
                    {
                        goto Label_08D3;
                    }
                    int num38 = num4;
                    num9 = 0;
                    while (num9 <= num38)
                    {
                        TypeCode empty;
                        num = numArray[num9];
                        if (num == -1)
                        {
                            if (!infoArray[num9].IsOptional && (num9 != numArray2[num5]))
                            {
                                if (length == 1)
                                {
                                    throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) }));
                                }
                                goto Label_08D3;
                            }
                        }
                        else
                        {
                            type = argTypes[num];
                            if (type != null)
                            {
                                if ((num8 != -1) && (num9 > num8))
                                {
                                    parameterType = infoArray[num8].ParameterType.GetElementType();
                                }
                                else
                                {
                                    parameterType = infoArray[num9].ParameterType;
                                    if (parameterType.IsByRef)
                                    {
                                        parameterType = parameterType.GetElementType();
                                    }
                                    if (num9 == num8)
                                    {
                                        if (parameterType.IsInstanceOfType(args[num]) && (num9 == num4))
                                        {
                                            goto Label_08C2;
                                        }
                                        parameterType = elementType;
                                    }
                                }
                                if ((parameterType != type) && ((type != Type.Missing) || !infoArray[num9].IsOptional))
                                {
                                    if (args[num] == Missing.Value)
                                    {
                                        goto Label_08D3;
                                    }
                                    if ((parameterType != typeof(object)) && !parameterType.IsInstanceOfType(args[num]))
                                    {
                                        TypeCode typeCode = Type.GetTypeCode(parameterType);
                                        if (type == null)
                                        {
                                            empty = TypeCode.Empty;
                                        }
                                        else
                                        {
                                            empty = Type.GetTypeCode(type);
                                        }
                                        switch (typeCode)
                                        {
                                            case TypeCode.Boolean:
                                            case TypeCode.Byte:
                                            case TypeCode.Int16:
                                            case TypeCode.Int32:
                                            case TypeCode.Int64:
                                            case TypeCode.Single:
                                            case TypeCode.Double:
                                            case TypeCode.Decimal:
                                                switch (empty)
                                                {
                                                    case TypeCode.Boolean:
                                                    case TypeCode.Byte:
                                                    case TypeCode.Int16:
                                                    case TypeCode.Int32:
                                                    case TypeCode.Int64:
                                                    case TypeCode.Single:
                                                    case TypeCode.Double:
                                                    case TypeCode.Decimal:
                                                    case TypeCode.String:
                                                        goto Label_08C2;
                                                }
                                                goto Label_08D3;

                                            case TypeCode.Char:
                                                switch (empty)
                                                {
                                                    case TypeCode.String:
                                                        goto Label_08D3;
                                                }
                                                goto Label_08C2;

                                            case TypeCode.SByte:
                                            case TypeCode.UInt16:
                                            case TypeCode.UInt32:
                                            case TypeCode.UInt64:
                                            case (TypeCode.DateTime | TypeCode.Object):
                                                goto Label_0896;

                                            case TypeCode.DateTime:
                                                switch (empty)
                                                {
                                                    case TypeCode.String:
                                                        goto Label_08D3;
                                                }
                                                goto Label_08C2;

                                            case TypeCode.String:
                                                switch (empty)
                                                {
                                                    case TypeCode.Empty:
                                                    case TypeCode.Boolean:
                                                    case TypeCode.Char:
                                                    case TypeCode.Byte:
                                                    case TypeCode.Int16:
                                                    case TypeCode.Int32:
                                                    case TypeCode.Int64:
                                                    case TypeCode.Single:
                                                    case TypeCode.Double:
                                                    case TypeCode.Decimal:
                                                    case TypeCode.String:
                                                        goto Label_08C2;
                                                }
                                                break;

                                            default:
                                                goto Label_0896;
                                        }
                                        if (type != typeof(char[]))
                                        {
                                            goto Label_08D3;
                                        }
                                    }
                                }
                            }
                        }
                        goto Label_08C2;
                    Label_0896:
                        if (parameterType != typeof(char[]))
                        {
                            goto Label_08D3;
                        }
                        TypeCode code10 = empty;
                        if ((code10 != TypeCode.String) && ((code10 != TypeCode.Object) || (type != typeof(char[]))))
                        {
                            goto Label_08D3;
                        }
                    Label_08C2:
                        num9++;
                    }
                }
                continue;
            Label_08D3:
                if (length == 1)
                {
                    if (num2 != 1)
                    {
                        throw new AmbiguousMatchException(Utils.GetResourceString("AmbiguousMatch_NarrowingConversion1", new string[] { this.CalledMethodName() }));
                    }
                    this.ThrowInvalidCast(type, parameterType, num9);
                }
                match[num5] = null;
                length--;
            }
            length = 0;
            int num39 = match.GetUpperBound(0);
            for (num5 = 0; num5 <= num39; num5++)
            {
                base4 = match[num5];
                if (base4 != null)
                {
                    numArray = (int[]) paramOrder[num5];
                    infoArray = base4.GetParameters();
                    bool flag3 = false;
                    num4 = infoArray.GetUpperBound(0);
                    if (isPropertySet)
                    {
                        num4--;
                    }
                    num3 = args.GetUpperBound(0);
                    if (isPropertySet)
                    {
                        num3--;
                    }
                    num8 = numArray2[num5];
                    if (num8 != -1)
                    {
                        elementType = infoArray[num4].ParameterType.GetElementType();
                    }
                    int num40 = num4;
                    num9 = 0;
                    while (num9 <= num40)
                    {
                        if (num9 == num8)
                        {
                            parameterType = elementType;
                        }
                        else
                        {
                            parameterType = infoArray[num9].ParameterType;
                        }
                        if (parameterType.IsByRef)
                        {
                            flag3 = true;
                            parameterType = parameterType.GetElementType();
                        }
                        num = numArray[num9];
                        if (((num != -1) || !infoArray[num9].IsOptional) && (num9 != numArray2[num5]))
                        {
                            type = argTypes[num];
                            if (((type != null) && ((type != Type.Missing) || !infoArray[num9].IsOptional)) && ((parameterType != type) && (parameterType != typeof(object))))
                            {
                                TypeCode code3;
                                TypeCode code4 = Type.GetTypeCode(parameterType);
                                if (type == null)
                                {
                                    code3 = TypeCode.Empty;
                                }
                                else
                                {
                                    code3 = Type.GetTypeCode(type);
                                }
                                switch (code4)
                                {
                                    case TypeCode.Boolean:
                                    case TypeCode.Byte:
                                    case TypeCode.Int16:
                                    case TypeCode.Int32:
                                    case TypeCode.Int64:
                                    case TypeCode.Single:
                                    case TypeCode.Double:
                                    case TypeCode.Decimal:
                                        switch (code3)
                                        {
                                            case TypeCode.Boolean:
                                            case TypeCode.Byte:
                                            case TypeCode.Int16:
                                            case TypeCode.Int32:
                                            case TypeCode.Int64:
                                            case TypeCode.Single:
                                            case TypeCode.Double:
                                            case TypeCode.Decimal:
                                            case TypeCode.String:
                                                goto Label_0B0F;
                                        }
                                        goto Label_0AF9;
                                }
                            }
                        }
                        goto Label_0B0F;
                    Label_0AF9:
                        if (length == 0)
                        {
                            this.ThrowInvalidCast(type, parameterType, num9);
                        }
                    Label_0B0F:
                        num9++;
                    }
                    if (num9 > num4)
                    {
                        if (num5 != length)
                        {
                            match[length] = match[num5];
                            paramOrder[length] = paramOrder[num5];
                            numArray2[length] = numArray2[num5];
                            match[num5] = null;
                        }
                        length++;
                        if (flag3)
                        {
                            flag = true;
                        }
                    }
                    else
                    {
                        match[num5] = null;
                    }
                }
            }
            if (length == 0)
            {
                throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) }));
            }
            VBBinderState state = new VBBinderState();
            this.m_state = state;
            ObjState = state;
            state.m_OriginalArgs = args;
            if (length == 1)
            {
                num11 = 0;
            }
            else
            {
                num11 = 0;
                BindScore unknown = BindScore.Unknown;
                int num17 = 0;
                int num41 = length - 1;
                for (num5 = 0; num5 <= num41; num5++)
                {
                    base4 = match[num5];
                    if (base4 != null)
                    {
                        numArray = (int[]) paramOrder[num5];
                        BindScore score2 = this.BindingScore(base4.GetParameters(), numArray, argTypes, isPropertySet, numArray2[num5]);
                        if (score2 < unknown)
                        {
                            if (num5 != 0)
                            {
                                match[0] = match[num5];
                                paramOrder[0] = paramOrder[num5];
                                numArray2[0] = numArray2[num5];
                                match[num5] = null;
                            }
                            num17 = 1;
                            unknown = score2;
                            continue;
                        }
                        if (score2 == unknown)
                        {
                            if ((score2 == BindScore.Exact) || (score2 == BindScore.Widening1))
                            {
                                bool flag4;
                                switch (this.GetMostSpecific(match[0], base4, numArray, paramOrder, isPropertySet, numArray2[0], numArray2[num5], args))
                                {
                                    case -1:
                                    {
                                        if (num17 != num5)
                                        {
                                            match[num17] = match[num5];
                                            paramOrder[num17] = paramOrder[num5];
                                            numArray2[num17] = numArray2[num5];
                                            match[num5] = null;
                                        }
                                        num17++;
                                        continue;
                                    }
                                    case 0:
                                    {
                                        continue;
                                    }
                                    default:
                                    {
                                        flag4 = true;
                                        int num42 = num17 - 1;
                                        for (int m = 1; m <= num42; m++)
                                        {
                                            if (this.GetMostSpecific(match[m], base4, numArray, paramOrder, isPropertySet, numArray2[m], numArray2[num5], args) != 1)
                                            {
                                                flag4 = false;
                                                break;
                                            }
                                        }
                                        break;
                                    }
                                }
                                if (flag4)
                                {
                                    num17 = 0;
                                }
                                if (num5 != num17)
                                {
                                    match[num17] = match[num5];
                                    paramOrder[num17] = paramOrder[num5];
                                    numArray2[num17] = numArray2[num5];
                                    match[num5] = null;
                                }
                                num17++;
                                continue;
                            }
                            if (num17 != num5)
                            {
                                match[num17] = match[num5];
                                paramOrder[num17] = paramOrder[num5];
                                numArray2[num17] = numArray2[num5];
                                match[num5] = null;
                            }
                            num17++;
                            continue;
                        }
                        match[num5] = null;
                    }
                }
                if (num17 > 1)
                {
                    int num43 = match.GetUpperBound(0);
                    for (num5 = 0; num5 <= num43; num5++)
                    {
                        base4 = match[num5];
                        if (base4 != null)
                        {
                            int num44 = match.GetUpperBound(0);
                            for (int n = 0; n <= num44; n++)
                            {
                                if (((num5 != n) && (match[n] != null)) && ((base4 == match[n]) || (base4.DeclaringType.IsSubclassOf(match[n].DeclaringType) && this.MethodsDifferOnlyByReturnType(base4, match[n]))))
                                {
                                    match[n] = null;
                                    num17--;
                                }
                            }
                        }
                    }
                    int num45 = match.GetUpperBound(0);
                    for (num5 = 0; num5 <= num45; num5++)
                    {
                        if (match[num5] == null)
                        {
                            int num46 = match.GetUpperBound(0);
                            for (int num20 = num5 + 1; num20 <= num46; num20++)
                            {
                                MethodBase base5 = match[num20];
                                if (base5 != null)
                                {
                                    match[num5] = base5;
                                    paramOrder[num5] = paramOrder[num20];
                                    numArray2[num5] = numArray2[num20];
                                    match[num20] = null;
                                }
                            }
                        }
                    }
                }
                if (num17 > 1)
                {
                    string str = "\r\n    " + Utils.MethodToString(match[0]);
                    int num47 = num17 - 1;
                    for (num5 = 1; num5 <= num47; num5++)
                    {
                        str = str + "\r\n    " + Utils.MethodToString(match[num5]);
                    }
                    switch (unknown)
                    {
                        case BindScore.Exact:
                            throw new AmbiguousMatchException(Utils.GetResourceString("AmbiguousCall_ExactMatch2", new string[] { this.CalledMethodName(), str }));

                        case BindScore.Widening0:
                        case BindScore.Widening1:
                            throw new AmbiguousMatchException(Utils.GetResourceString("AmbiguousCall_WideningConversion2", new string[] { this.CalledMethodName(), str }));
                    }
                    throw new AmbiguousMatchException(Utils.GetResourceString("AmbiguousCall2", new string[] { this.CalledMethodName(), str }));
                }
            }
            MethodBase base3 = match[num11];
            numArray = (int[]) paramOrder[num11];
            if (names != null)
            {
                this.ReorderParams(numArray, args, state);
            }
            ParameterInfo[] parameters = base3.GetParameters();
            if (args.Length > 0)
            {
                state.m_ByRefFlags = new bool[args.GetUpperBound(0) + 1];
                flag = false;
                int num48 = parameters.GetUpperBound(0);
                for (num9 = 0; num9 <= num48; num9++)
                {
                    if (parameters[num9].ParameterType.IsByRef)
                    {
                        if (state.m_OriginalParamOrder == null)
                        {
                            if (num9 < state.m_ByRefFlags.Length)
                            {
                                state.m_ByRefFlags[num9] = true;
                            }
                        }
                        else if (num9 < state.m_OriginalParamOrder.Length)
                        {
                            int num21 = state.m_OriginalParamOrder[num9];
                            if (num21 >= 0)
                            {
                                state.m_ByRefFlags[num21] = true;
                            }
                        }
                        flag = true;
                    }
                }
                if (!flag)
                {
                    state.m_ByRefFlags = null;
                }
            }
            else
            {
                state.m_ByRefFlags = null;
            }
            num8 = numArray2[num11];
            if (num8 != -1)
            {
                num4 = parameters.GetUpperBound(0);
                if (isPropertySet)
                {
                    num4--;
                }
                num3 = args.GetUpperBound(0);
                if (isPropertySet)
                {
                    num3--;
                }
                object[] objArray4 = new object[(parameters.Length - 1) + 1];
                int num49 = Math.Min(num3, num8) - 1;
                for (num9 = 0; num9 <= num49; num9++)
                {
                    objArray4[num9] = ObjectType.CTypeHelper(args[num9], parameters[num9].ParameterType);
                }
                if (num3 < num8)
                {
                    int num50 = num8 - 1;
                    for (num9 = num3 + 1; num9 <= num50; num9++)
                    {
                        objArray4[num9] = ObjectType.CTypeHelper(parameters[num9].DefaultValue, parameters[num9].ParameterType);
                    }
                }
                if (isPropertySet)
                {
                    int num22 = objArray4.GetUpperBound(0);
                    objArray4[num22] = ObjectType.CTypeHelper(args[args.GetUpperBound(0)], parameters[num22].ParameterType);
                }
                if (num3 == -1)
                {
                    objArray4[num8] = Array.CreateInstance(elementType, 0);
                }
                else
                {
                    elementType = parameters[num4].ParameterType.GetElementType();
                    int num23 = (args.Length - parameters.Length) + 1;
                    parameterType = parameters[num4].ParameterType;
                    if (((num23 == 1) && parameterType.IsArray) && ((args[num8] == null) || parameterType.IsInstanceOfType(args[num8])))
                    {
                        objArray4[num8] = args[num8];
                    }
                    else if (elementType == typeof(object))
                    {
                        object[] objArray5 = new object[(num23 - 1) + 1];
                        int num51 = num23 - 1;
                        for (num = 0; num <= num51; num++)
                        {
                            objArray5[num] = ObjectType.CTypeHelper(args[num + num8], elementType);
                        }
                        objArray4[num8] = objArray5;
                    }
                    else
                    {
                        Array array = Array.CreateInstance(elementType, num23);
                        int num52 = num23 - 1;
                        for (num = 0; num <= num52; num++)
                        {
                            array.SetValue(ObjectType.CTypeHelper(args[num + num8], elementType), num);
                        }
                        objArray4[num8] = array;
                    }
                }
                args = objArray4;
            }
            else
            {
                object[] objArray6 = new object[(parameters.Length - 1) + 1];
                int num53 = objArray6.GetUpperBound(0);
                num = 0;
                while (num <= num53)
                {
                    int num24 = numArray[num];
                    if ((num24 >= 0) && (num24 <= args.GetUpperBound(0)))
                    {
                        objArray6[num] = ObjectType.CTypeHelper(args[num24], parameters[num].ParameterType);
                    }
                    else
                    {
                        objArray6[num] = ObjectType.CTypeHelper(parameters[num].DefaultValue, parameters[num].ParameterType);
                    }
                    num++;
                }
                int num54 = parameters.GetUpperBound(0);
                for (num9 = num; num9 <= num54; num9++)
                {
                    objArray6[num9] = ObjectType.CTypeHelper(parameters[num9].DefaultValue, parameters[num9].ParameterType);
                }
                args = objArray6;
            }
            if (base3 == null)
            {
                throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) }));
            }
            return base3;
        }