public static void DiscoverArguments(
            IDescriptorContext context,
            ICollection <ArgumentDefinition> arguments,
            MemberInfo?member)
        {
            if (arguments == null)
            {
                throw new ArgumentNullException(nameof(arguments));
            }

            if (member is MethodInfo method)
            {
                var processed = new HashSet <NameString>(
                    arguments.Select(t => t.Name));

                foreach (ParameterInfo parameter in method.GetParameters())
                {
                    if (IsArgumentType(method, parameter))
                    {
                        ArgumentDefinition argumentDefinition =
                            ArgumentDescriptor
                            .New(context, parameter)
                            .CreateDefinition();

                        if (processed.Add(argumentDefinition.Name))
                        {
                            arguments.Add(argumentDefinition);
                        }
                    }
                }
            }
        }
        protected void Argument(
            NameString name,
            Action <IArgumentDescriptor> argument)
        {
            if (argument is null)
            {
                throw new ArgumentNullException(nameof(argument));
            }

            name.EnsureNotEmpty(nameof(name));

            ParameterInfo parameter = null;

            Parameters?.TryGetValue(name, out parameter);

            ArgumentDescriptor descriptor = parameter is null
                ? Arguments.FirstOrDefault(t => t.Definition.Name.Equals(name))
                : Arguments.FirstOrDefault(t => t.Definition.Parameter == parameter);

            if (descriptor is null)
            {
                descriptor = parameter is null
                    ? ArgumentDescriptor.New(Context, name)
                    : ArgumentDescriptor.New(Context, parameter);

                Arguments.Add(descriptor);
            }

            argument(descriptor);
        }
        protected void Argument(
            NameString name,
            Action <IArgumentDescriptor> argument)
        {
            if (argument == null)
            {
                throw new ArgumentNullException(nameof(argument));
            }

            name.EnsureNotEmpty(nameof(name));

            ArgumentDescriptor descriptor =
                Parameters != null &&
                Parameters.TryGetValue(name, out ParameterInfo p)
                    ? ArgumentDescriptor.New(Context, p)
                    : ArgumentDescriptor.New(Context, name);

            argument(descriptor);

            ArgumentDefinition definition = descriptor.CreateDefinition();

            Definition.Arguments.Add(definition);
        }