单声道选项:检查是否给出了无效的选项

本文关键字:选项 无效 是否 声道 单声道 检查 | 更新日期: 2023-09-27 17:56:47

>我已经定义了

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();
    }
}