我已经定义
var p = new OptionSet () {
// various options defined
};
然后我
p.Parse(args)
如果我用
myprogram --thisOptionIsNotDefined
我想显示帮助消息,而不是继续。但是 Parse() 在遇到无效选项时不会抛出 OptionException。我该怎么办?
您可以查询返回OptionSet.Parse()
以查找任何无效参数。
从 NDesk 选项集文档:
OptionSet.Parse(IEnumerable),返回一个没有被注册的 NDesk.Options.Option 匹配的所有参数的列表。
OptionSet.Parse()
返回任何未处理的参数。但是请注意,这也可能包括程序的任何实际(非选项)参数,例如输入文件。在这种情况下,您不能只检查是否没有返回任何内容。
例如解析以下args
将返回["input.txt", "--thisOptionIsNotDefined"]
。
myprogram input.txt --thisOptionIsNotDefined
为了解决这个特殊问题,我写了一个扩展方法p.ParseStrict(args)
。它只是检查解析后没有未处理的选项(考虑--
到)。
public static class MonoOptionsExtensions
{
public static List<string> ParseStrict(this OptionSet source, IEnumerable<string> arguments)
{
var args = arguments.ToArray();
var beforeDoubleDash = args.TakeWhile(x => x != "--");
var unprocessed = source.Parse(beforeDoubleDash);
var firstUnprocessedOpt = unprocessed.Find(x => x.Length > 0 && (x[0] == '-' || x[0] == '/'));
if (firstUnprocessedOpt != null)
throw new OptionException("Unregistered option '" + firstUnprocessedOpt + "' encountered.", firstUnprocessedOpt);
return unprocessed.Concat(args.SkipWhile(x => x != "--").Skip(1)).ToList();
}
}