Exemplo n.º 1
0
        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);
        }