public Expression[] GetConstructorInvocationArguments(Expression[] arguments, ClassEmitter proxy) { var allArguments = new Expression[arguments.Length + 1]; allArguments[0] = new ReferenceExpression(BuildDelegateToken(proxy)); Array.Copy(arguments, 0, allArguments, 1, arguments.Length); return allArguments; }
private Reference GetDelegate(AbstractTypeEmitter invocation, MethodEmitter invokeMethodOnTarget) { var closedDelegateType = delegateType.MakeGenericType(invocation.GenericTypeParams); var localReference = invokeMethodOnTarget.CodeBuilder.DeclareLocal(closedDelegateType); var closedMethodOnTarget = method.MethodOnTarget.MakeGenericMethod(invocation.GenericTypeParams); var localTarget = new ReferenceExpression(targetReference); invokeMethodOnTarget.CodeBuilder.AddStatement( SetDelegate(localReference, localTarget, closedDelegateType, closedMethodOnTarget)); return localReference; }
private AssignStatement SetDelegate(LocalReference localDelegate, ReferenceExpression localTarget, Type closedDelegateType, MethodInfo closedMethodOnTarget) { var delegateCreateDelegate = new MethodInvocationExpression( null, DelegateMethods.CreateDelegate, new TypeTokenExpression(closedDelegateType), localTarget, new MethodTokenExpression(closedMethodOnTarget)); return new AssignStatement(localDelegate, new ConvertExpression(closedDelegateType, delegateCreateDelegate)); }
public static ReferenceExpression[] ConvertToArgumentReferenceExpression(ParameterInfo[] args) { var arguments = new ReferenceExpression[args.Length]; for (var i = 0; i < args.Length; ++i) { arguments[i] = new ReferenceExpression(new ArgumentReference(args[i].ParameterType, i + 1, args[i].Attributes)); } return arguments; }