我想在命令行选项集中添加-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个参数。
答案 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