/// <summary> /// Defines the non interceptable method. /// </summary> /// <param name="methodInfo">The <see cref="MethodInfo"/> of the type to intercept.</param> /// <param name="attributes">The attributes applied to the generated method.</param> /// <returns>The <see cref="MethodBuilder"/> representing the generated method.</returns> /// <exception cref="ArgumentNullException">Specified <paramref name="methodInfo"/> is null.</exception> private MethodBuilder DefineNonInterceptableMethod(MethodInfo methodInfo, MethodAttributes attributes) { Guard.ArgumentNotNull(methodInfo, nameof(methodInfo)); methodInfo = _interceptors.GetTargetMethod(methodInfo); var parameters = methodInfo.GetParameters(); var parameterTypes = parameters.Select(it => it.ParameterType).ToArray(); var methodBuilder = _typeBuilder.DefineMethod(methodInfo.Name, attributes, methodInfo.ReturnType, parameterTypes); if (methodInfo.IsGenericMethod) { DefineMethodGenericParameters(methodBuilder, methodInfo); } for (int index = 0; index < parameters.Length; index++) { var parameter = parameters[index]; methodBuilder.DefineParameter(index, parameter.Attributes, parameter.Name); } var il = methodBuilder.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldfld, _targetField); for (int index = 0; index < parameters.Length; index++) { var parameter = parameters[index]; il.EmitLoadArgument(index); } il.Emit(OpCodes.Call, methodInfo); il.Emit(OpCodes.Ret); return(methodBuilder); }