命令行解析器-使用数组的选项会触发以下异常:“序列不包含任何元素”

时间:2018-07-05 19:59:15

标签: c#

使用CommandLineParser库的最新版本,我有很多选择。我的目标是使用此命令行应用程序编辑XML文件,尽管这样有望扩展。

public class MyOptions
{
    [Option('h', "sayhello")]
    public string HelloMessage { get; set; }

    [Option('v', "versioninfo")]
    public string VersionInfo { get; set; }

    [Option('c', "changenode")]
    public string[] ChangeNode { get; set; }

    [Option('g', "getnode")]
    public string[] GetNode { get; set; }
}

当我在Visual Studio中调试应用程序并通过Project Properties -> Debug -> Command line arguments向其传递以下参数/值时:

--sayhello hello

应用程序引发InvalidOperationException,表示该序列不包含任何元素。如果我注释掉string[]类型的两个选项(ChangeNode和GetNode)或将它们更改为IEnumerable<string>,则程序运行不会出现问题,请输入以下代码:

if (!string.IsNullOrEmpty(options.HelloMessage))
    Console.WriteLine($"The message is: {options.HelloMessage}");

打印:

消息是:你好

将类型string[]的选项更改为List<string>或将这些选项设置为Required = false仍会引发相同的异常。我对将IEnumerable强制转换为另一个用于处理这些选项的逻辑没有任何疑虑,但是我不确定这是否是正确的做法。如何在CommandLineParser中使用数组/集合来避免这种情况?该文档非常基础,并且在一些“快速入门”示例之外没有详细介绍该库的工作方式。

2 个答案:

答案 0 :(得分:0)

如果我为该选项定义默认值,它将对我有用:

    [Option(HelpText = "Optionally specify all processes to document separated by a comma ','.", Separator = ',', Default = new string[0])]
    public string[] ProcessesToDocument { get; set; } = new string[0];

答案 1 :(得分:0)

我遇到了同样的问题,并且可以这样解决:

private string[] _parametersArray = new string[0];

[Option("parameters")]
public IEnumerable<string> Parameters
{
    get { return _parametersArray; }
    set { _parametersArray = value.ToArray(); }
}
public string[] ParametersArray
{
    get { return _parametersArray; }
}