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;
}