Я пытаюсь добавить параметр логического флага в свою программу System.CommandLine C#/.NET. Однако ничто из того, что я указываю при запуске программы, похоже, не приводит к значению true
в моем обработчике команд:
using System.CommandLine;
using System.CommandLine.Parsing;
using System.CommandLine.Builder;
using System.CommandLine.NamingConventionBinder;
var rootCommand = new RootCommand
{
Description = "System.CommandLine Example"
};
var exampleOption = new Option<bool>(
new[] { "--opt", "-o" },
"Set an example boolean option to true"
);
var exampleCommand = new Command("command", "Example command")
{
Handler = CommandHandler.Create<bool>((flag) =>
{
Console.WriteLine($"Ran example command with opt = {flag}");
})
};
exampleCommand.AddOption(exampleOption);
rootCommand.AddCommand(exampleCommand);
var parser = new CommandLineBuilder(rootCommand)
.UseHelp()
.UseDefaults()
.Build();
await parser.InvokeAsync(args);
Когда я вызываю его, я получаю такой результат:
SystemCommandLineExample.exe command --opt=true
Ran example command with opt=False
Что я делаю не так?
Это потому, что вы используете связующее соглашение об именах, но вы не соответствуете своему именованию. Вы указали, что имя опции — opt
, но ваш параметр называется flag
. Если вы просто измените свою команду на эту, она сработает:
var exampleCommand = new Command("command", "Example command")
{
Handler = CommandHandler.Create<bool>((bool opt) =>
{
Console.WriteLine($"Ran example command with opt = {opt}");
})
};
Из документации :
По умолчанию параметры сопоставляются по имени, поэтому в следующем примере опция
--an-int
соответствует параметру с именемanInt
. При сопоставлении игнорируются дефисы (и другие префиксы опций, такие как «/») и не учитывается регистр.