public virtual ArgumentMatchResult TryGetTypedArguments()

in src/StreamJsonRpc/Protocol/JsonRpcRequest.cs [196:243]


        public virtual ArgumentMatchResult TryGetTypedArguments(ReadOnlySpan<ParameterInfo> parameters, Span<object?> typedArguments)
        {
            Requires.Argument(parameters.Length == typedArguments.Length, nameof(typedArguments), "Length of spans do not match.");

            // If we're given more arguments than parameters to hold them, that's a pretty good sign there's a method mismatch.
            if (parameters.Length < this.ArgumentCount)
            {
                return ArgumentMatchResult.ParameterArgumentCountMismatch;
            }

            if (parameters.Length == 0)
            {
                return ArgumentMatchResult.Success;
            }

            for (int i = 0; i < parameters.Length; i++)
            {
                ParameterInfo parameter = parameters[i];
                if (this.TryGetArgumentByNameOrIndex(parameter.Name, i, parameter.ParameterType, out object? argument))
                {
                    if (argument is null)
                    {
                        if (parameter.ParameterType.GetTypeInfo().IsValueType && Nullable.GetUnderlyingType(parameter.ParameterType) is null)
                        {
                            // We cannot pass a null value to a value type parameter.
                            return ArgumentMatchResult.ParameterArgumentTypeMismatch;
                        }
                    }
                    else if (!parameter.ParameterType.GetTypeInfo().IsAssignableFrom(argument.GetType()))
                    {
                        return ArgumentMatchResult.ParameterArgumentTypeMismatch;
                    }

                    typedArguments[i] = argument;
                }
                else if (parameter.HasDefaultValue)
                {
                    // The client did not supply an argument, but we have a default value to use, courtesy of the parameter itself.
                    typedArguments[i] = parameter.DefaultValue;
                }
                else
                {
                    return ArgumentMatchResult.MissingArgument;
                }
            }

            return ArgumentMatchResult.Success;
        }