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