【问题标题】:Value passed to CommandHandler is null传递给 CommandHandler 的值为 null
【发布时间】:2022-09-26 06:00:34
【问题描述】:

我正在尝试学习如何使用 System.CommandLine。我创建了一个简单的代码,它需要接受一个 url 和一个可选的文件路径参数。

    static async Task<int> Main(string[] args)
    {
        var cmd = new RootCommand(\"Save URL content to file\");
        cmd.AddArgument(new Argument<string>(\"URL\", \"The network resource url you want to retrieve\"));
        cmd.AddOption(new Option<FileInfo>(new[] { \"--output-document\", \"-O\" }, \"write document to FILE\"));
        cmd.Handler = CommandHandler.Create<string, FileInfo, IConsole >(HandleDownload);        

        return await cmd.InvokeAsync(args);
    }

    static void HandleDownload(string url, FileInfo file, IConsole console)
    {
        console.WriteLine(url);
        console.WriteLine(file.FullName);
    }

当我使用以下参数运行时

\"http://www.google.com\" --output-document c:\\test.html

内部 HandleDownload url 变量被正确分配,但 \'file\' 变量显示为空。我究竟做错了什么?

  • 是大写的问题吗? \"URL\" 参数名称与 url 方法名称

标签: c# .net-core system.commandline


【解决方案1】:

您似乎正在使用旧版本的 System.CommandLine,或者带有附加“NamingConventionBinding”包的新版本。

在这两种情况下,命令处理程序参数将通过匹配处理程序参数与选项/参数相关联姓名带有选项/参数别名。

在这里你绊倒了。[1]

您的 FileInfo 选项具有别名 --output-document 和 -O。但是您的命令处理程序没有具有匹配名称的参数(应该类似于FileInfo outputDocument 或FileInfo o)。

但是,您的命令处理程序有一个名为 file 的参数。但是没有选项或参数具有与名称“文件”相关的别名。因此,System.CommandLine 正在为此参数传递null。

因此,要解决您的问题,只需将处理程序的file 参数重命名为outputDocument 就足够了,Bob 应该是您的叔叔...



[1]顺便说一句,你不是唯一一个被这个绊倒的人。 System.CommandLine 的 github 存储库的问题跟踪器中有许多报告,用户以几乎相同的方式跳闸 - 使用不匹配的处理程序参数名称导致无法直观理解的意外行为。 (然后还有不得不重构处理程序参数名称的痛苦,如果要重命名选项别名以获得更好、更整洁的别名。唉……)除其他原因外,这最终导致了包不再使用命名约定绑定作为较新版本的 System.CommandLine 的默认值。建立处理程序现在需要将每个处理程序参数与各自的Option/Argument 实例显式关联。 (如果希望继续使用与较新 System.CommandLine 版本的命名约定绑定,附加包 System.CommandLine.NamingConventionBinding 将启用此功能。)

【讨论】:

  • 谢谢你。你是对的。参数名称与参数命名不匹配。我不知道它必须是。
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 2017-11-03
  • 2018-09-04
  • 2022-06-11
  • 2015-08-26
  • 2012-11-18
  • 1970-01-01
  • 2010-11-21
相关资源
最近更新 更多