public static object[] BuildArguments(ParameterInfo[] parameters, IResolveFieldContext context) { if (parameters == null || parameters.Length == 0) { return(null); } object[] arguments = new object[parameters.Length]; var index = 0; if (parameters[index].ParameterType.IsAssignableFrom(context.GetType())) { arguments[index] = context; index++; } if (parameters.Length > index && context.Source != null && (context.Source?.GetType() == parameters[index].ParameterType || string.Equals(parameters[index].Name, "source", StringComparison.OrdinalIgnoreCase))) { arguments[index] = context.Source; index++; } if (parameters.Length > index && context.UserContext != null && parameters[index].ParameterType.IsInstanceOfType(context.UserContext)) { arguments[index] = context.UserContext; index++; } foreach (var parameter in parameters.Skip(index)) { arguments[index] = context.GetArgument(parameter.ParameterType, parameter.Name); index++; } return(arguments); }