如何使用ndesk选项添加一个带三个参数的选项?

时间:2018-05-30 04:35:26

标签: c# command-line-arguments ndesk.options

我想在命令行选项集中添加-D=Id1:Id2:Id3之类的选项。 我怎样才能做到这一点 ?此选项必须是强制性的。

我试着这样做:

var optSet = new OptionSet() 
{
    { "D:", "Device to communicate with.",
        (int id1, int id2, int id3) => {
            if (id1 == null)
                throw new OptionException ("Missing Id1 for option -D.", "-D");
            if(id2 == null)
                throw new OptionException ("Missing Id2 for option -D.",  "-D");
            if(id3 == null)
                throw new OptionException ("Missing Id3 for option -D.",  "-D"); 
} },

但我得到的错误是该行动只有2个参数。

1 个答案:

答案 0 :(得分:0)

改用类似 CSV/SSV 的语法,例如-D=Id1,Id2,Id3-D=Id1;Id2;Id 等。然后使用 NDesk.Options 解析为单个组合结果 Id1,Id2,Id3 然后使用 .Split(',') 验证长度或计数为 3 或打印用法留言。

修改 NDesk.Options 应该很容易——它只是一个文件——通过在内部拆分数组并返回它来为您处理这个问题。

对于我认为非法的空选项之类的事情,我也必须这样做,例如- 如果我记得的话,因为我不喜欢默认行为。它现在已成为我首选的 C# 命令行选项处理程序以及以下 C#(和 Python)中的 {--/}key=value 解析器,带有或不带有前导选项字符:

public static Dictionary<string, string> KVs2Dict(IEnumerable<string> args, Dictionary<string, string> defaults = null)
{
    Dictionary<string, string> d = defaults ?? new Dictionary<string, string>();
    foreach (string arg in args)
    {
        string s = arg.TrimStart(new[] { '-', '/' });
        string[] sa = s.Split(new[] { '=' }, 1);
        string k = sa[0].Trim('"');
        if (s.Contains('='))
        {
            string v = sa[1].Trim('"');
            d[k] = v;
        }
        else
            d[k] = null;
    }
    return d;
}

保持简单:有了这个,您甚至不需要 NDesk.Options 来处理简单的应用程序。

添加多个值有多容易?简单:只需添加另一个条件并返回 Dictionary 代替!