/// <summary> /// The generate dispatch block for method. /// </summary> /// <param name="methodDescription"> /// The method description. /// </param> /// <param name="instance"> /// The instance. /// </param> /// <param name="event"> /// The event. /// </param> /// <returns> /// The <see cref="StatementSyntax"/>. /// </returns> private static StatementSyntax GenerateDispatchBlockForMethod(ActorMethodDescription methodDescription, IdentifierNameSyntax instance, IdentifierNameSyntax @event) { // Construct expressions to retrieve each of the method's parameters. var method = methodDescription.MethodInfo; var parameters = new List <ExpressionSyntax>(); var methodParameters = method.GetParameters().ToList(); for (var i = 0; i < methodParameters.Count; i++) { var parameter = methodParameters[i]; var parameterType = parameter.ParameterType.GetTypeSyntax(); var indexArg = SF.Argument( SF.LiteralExpression(SyntaxKind.NumericLiteralExpression, SF.Literal(i))); var getArg = SF.InvocationExpression(@event.Member("Arg", parameterType)).AddArgumentListArguments(indexArg); parameters.Add(getArg); } var grainMethodCall = SF.InvocationExpression(instance.Member(method.Name)) .AddArgumentListArguments(parameters.Select(SF.Argument).ToArray()); return(SF.ReturnStatement(SF.InvocationExpression(grainMethodCall.Member("Box")))); }