0

我想-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 个参数。

4

1 回答 1

0

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

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

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

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<string, object> !

于 2021-02-20T06:34:02.983 回答