public TR InvokeFunc3 <A1, A2, A3, TR> (object o, A1 a1, A2 a2, A3 a3)
        {
            Stats.Increment(StatsCounter.InvokeMemberBinderInvoked);

            bool invokeOnly = false;

            if (mOverloadState != OverloadState.HasOverload)
            {
                invokeOnly = UpdateInvoker(o);
                ICallerF <A1, A2, A3, TR> caller = mInvoker as ICallerF <A1, A2, A3, TR>;
                if (caller != null)
                {
                    Stats.Increment(StatsCounter.InvokeMemberBinderInvoked_Fast);

                    return(caller.Call(a1, a2, a3));                    // Fast path
                }
            }

            var args = mArgs;

            args[0] = (object)a1;
            args[1] = (object)a2;
            args[2] = (object)a3;
            return(ResolveAndInvoke <TR>(o, invokeOnly));
        }
        public TR InvokeFunc8 <A1, A2, A3, A4, A5, A6, A7, A8, TR> (object o, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
        {
            Stats.Increment(StatsCounter.InvokeMemberBinderInvoked);

            bool invokeOnly = false;

            if (mOverloadState != OverloadState.HasOverload)
            {
                invokeOnly = UpdateInvoker(o);
                ICallerF <A1, A2, A3, A4, A5, A6, A7, A8, TR> caller = mInvoker as ICallerF <A1, A2, A3, A4, A5, A6, A7, A8, TR>;
                if (caller != null)
                {
                    Stats.Increment(StatsCounter.InvokeMemberBinderInvoked_Fast);

                    return(caller.Call(a1, a2, a3, a4, a5, a6, a7, a8));                        // Fast path
                }
            }

            var args = mArgs;

            args[0] = (object)a1;
            args[1] = (object)a2;
            args[2] = (object)a3;
            args[3] = (object)a4;
            args[4] = (object)a5;
            args[5] = (object)a6;
            args[6] = (object)a7;
            args[7] = (object)a8;
            return(ResolveAndInvoke <TR>(o, invokeOnly));
        }
        public TR InvokeFunc0 <TR>(object o)
        {
            Stats.Increment(StatsCounter.InvokeMemberBinderInvoked);

            bool invokeOnly = false;

            if (mOverloadState != OverloadState.HasOverload)
            {
                invokeOnly = UpdateInvoker(o);
                ICallerF <TR> caller = mInvoker as ICallerF <TR>;
                if (caller != null)
                {
                    Stats.Increment(StatsCounter.InvokeMemberBinderInvoked_Fast);

                    return(caller.Call());                      // Fast path
                }
            }

            return(ResolveAndInvoke <TR>(o, invokeOnly));
        }