繁体   English   中英

Mono.Options:检查是否给出了无效的选项

[英]Mono.Options: Check if an invalid option is given

我已经定义

var p = new OptionSet () {
 // various options defined
};

然后我

p.Parse(args)

如果我用

myprogram --thisOptionIsNotDefined

我想显示帮助消息,而不继续。 但是,当Parse()遇到无效选项时,它不会引发OptionException。 我该怎么办?

您可以查询OptionSet.Parse()的返回值以查找任何无效参数。

从NDesk OptionSet 文档中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM