public static ProfilerInterceptor.RefReturn <TReturn> CreateDynamicMethodInvoker <TReturn>(object target, MethodInfo method, object[] args)
        {
            if (args.Length != method.GetParameters().Length)
            {
                throw new MockException(
                          String.Format("Number of the supplied arguments does not match to the expected one in the method signature:" +
                                        " supplied '{0}', expected '{1}'", args.Length, method.GetParameters().Length));
            }

            ProfilerInterceptor.RefReturn <TReturn> @delegate =
                MockingUtil.CreateDynamicMethod <ProfilerInterceptor.RefReturn <TReturn> >(
                    il =>
            {
                // store arguments as local variables
                il.UnpackArgArray(OpCodes.Ldarg_1, method);

                // push object reference to the stack in case if instance method
                if (target != null)
                {
                    il.Emit(OpCodes.Ldarg_0);
                }

                // push stored arguments back to the stack
                il.PushArgArray(method);

                il.Emit((target != null) ? OpCodes.Callvirt : OpCodes.Call, method as MethodInfo);
                il.Emit(OpCodes.Ret);
            });

            return(@delegate);
        }
Beispiel #2
0
        public ref TRefReturn GetProperty <TRefReturn>(string name)
        {
            return(ref ProfilerInterceptor.GuardInternal((target, arguments) =>
            {
                var prop = MockingUtil.ResolveProperty(this.type, name, false, null, this.instance != null);
                var method = prop.GetGetMethod(true);

                ProfilerInterceptor.RefReturn <TRefReturn> @delegate =
                    MockingUtil.CreateDynamicMethodInvoker <TRefReturn>(target, method, arguments);

                return ref ProfilerInterceptor.GuardExternal(@delegate, target, arguments);
            }, this.instance, MockingUtil.NoObjects));
        }
Beispiel #3
0
        public ref TRefReturn CallMethod <TRefReturn>(string name, params object[] args)
        {
            return(ref ProfilerInterceptor.GuardInternal((target, arguments) =>
            {
                arguments = arguments ?? MockingUtil.NoObjects;
                var candidates = type.GetAllMethods()
                                 .Where(m => m.Name == name && MockingUtil.CanCall(m, this.instance != null))
                                 .Select(m => MockingUtil.TrySpecializeGenericMethod(m, arguments.Select(a => a != null ? a.GetType() : null).ToArray()) ?? m)
                                 .ToArray();
                object state;
                var method = MockingUtil.BindToMethod(MockingUtil.AllMembers, candidates, ref arguments, null, null, null, out state);

                ProfilerInterceptor.RefReturn <TRefReturn> @delegate =
                    MockingUtil.CreateDynamicMethodInvoker <TRefReturn>(target, method as MethodInfo, arguments);

                return ref ProfilerInterceptor.GuardExternal(@delegate, target, arguments);
            }, this.instance, args ?? MockingUtil.NoObjects));
        }