--- uid: Guides.TextCommands.NamedArguments title: Named Arguments --- # Named Arguments By default, arguments for commands are parsed positionally, meaning that the order matters. But sometimes you may want to define a command with many optional parameters, and it'd be easier for end-users to only specify what they want to set, instead of needing them to specify everything by hand. ## Setting up Named Arguments In order to be able to specify different arguments by name, you have to create a new class that contains all of the optional values that the command will use, and apply an instance of [NamedArgumentTypeAttribute] on it. ### Example - Creating a Named Arguments Type ```cs [NamedArgumentType] public class NamableArguments { public string First { get; set; } public string Second { get; set; } public string Third { get; set; } public string Fourth { get; set; } } ``` ## Usage in a Command The command where you want to use these values can be declared like so: ```cs [Command("act")] public async Task Act(int requiredArg, NamableArguments namedArgs) ``` The command can now be invoked as `.act 42 first: Hello fourth: "A string with spaces must be wrapped in quotes" second: World`. A TypeReader for the named arguments container type is automatically registered. It's important that any other arguments that would be required are placed before the container type. > [!IMPORTANT] > A single command can have only __one__ parameter of a > type annotated with [NamedArgumentTypeAttribute], and it > **MUST** be the last parameter in the list. > A command parameter of such an annotated type > is automatically treated as if that parameter > has [RemainderAttribute](xref:Discord.Commands.RemainderAttribute) > applied. ## Complex Types The TypeReader for Named Argument Types will look for a TypeReader of every property type, meaning any other command parameter type will work just the same. You can also read multiple values into a single property by making that property an `IEnumerable`. So for example, if your Named Argument Type has the following field, ```cs public IEnumerable Numbers { get; set; } ``` then the command can be invoked as `.cmd numbers: "1, 2, 4, 8, 16, 32"` ## Additional Notes The use of [`[OverrideTypeReader]`](xref:Discord.Commands.OverrideTypeReaderAttribute) is also supported on the properties of a Named Argument Type. [NamedArgumentTypeAttribute]: xref:Discord.Commands.NamedArgumentTypeAttribute