private MethodBuilder CreateCallbackMethod(ClassEmitter emitter, MethodInfo methodInfo, MethodInfo methodOnTarget) { MethodInfo targetMethod = methodOnTarget ?? methodInfo; // MethodBuild creation MethodEmitter callBackMethod = emitter.CreateMethod(namingScope.GetUniqueName(methodInfo.Name + "_callback")); callBackMethod.CopyParametersAndReturnTypeFrom(targetMethod, emitter); // Generic definition if (targetMethod.IsGenericMethod) { targetMethod = targetMethod.MakeGenericMethod(callBackMethod.GenericTypeParams); } // Parameters exp Expression[] exps = new Expression[callBackMethod.Arguments.Length]; for (int i = 0; i < callBackMethod.Arguments.Length; i++) { exps[i] = callBackMethod.Arguments[i].ToExpression(); } // invocation on base class callBackMethod.CodeBuilder.AddStatement( new ReturnStatement(new MethodInvocationExpression(SelfReference.Self, targetMethod, exps))); return(callBackMethod.MethodBuilder); }