使用CommandLineParser报告未知参数

PHe*_*erg 5 c# command-line command-line-arguments command-line-parser

有没有办法让Command Line Parser库报告未知参数?

给出以下选项类:

public class Options
{
    [Option('i', "int-option", DefaultValue = 10, HelpText = "Set the int")]
    public int IntOption { get; set; }

    [ParserState]
    public IParserState LastParserState { get; set; }

    [HelpOption]
    public string GetUsage()
    {
        return HelpText.AutoBuild(this, 
            HelpText.DefaultParsingErrorsHandler(this, current));
    }
}
Run Code Online (Sandbox Code Playgroud)

以下程序:

var options = new Options();
var parser = new Parser(settings =>
{
    settings.HelpWriter = Console.Error;
    settings.IgnoreUnknownArguments = false;
});

if (parser.ParseArgumentsStrict(args, options))
{
    Console.WriteLine("Int value set: {0}", options.IntOption);
}
Run Code Online (Sandbox Code Playgroud)

使用"MyProgram.exe --unknown"调用程序时,我只获取默认的使用信息,但没有提到解析失败的错误.我想向用户提供一些错误的指示.

nem*_*esv 3

长话短说:在当前的实现中,您无法获得有关未知选项的任何信息。

长话短说:

如果将制动点放入GetUsage方法中,您将看到LastParserState不为 null,但包含 0 元素。

LastParserState基本上是从ArgumentParser.PostParsingState填充的,但是LongOptionParser(在您的情况下由于--双破折号而涉及) 没有在PostParsingState其解析方法内向集合中添加任何内容:

来源来自Github

var parts = argumentEnumerator.Current.Substring(2).Split(new[] { '=' }, 2);
var option = map[parts[0]];

if (option == null)
{
    return _ignoreUnkwnownArguments ? PresentParserState.MoveOnNextElement : 
                                      PresentParserState.Failure;
}
Run Code Online (Sandbox Code Playgroud)

因此,解析器内部不会存储任何有关出错原因的信息,只是记录该事实。