示例#1
0
        /// <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);
        }