HelpVerbOption不起作用 - 命令行解析器C#

时间:2016-08-22 12:14:32

标签: c# command-line command-line-arguments command-line-parser

我有一个班级:

class Options
{
  // Remainder omitted (verb1, verb2, verb3)
  [HelpVerbOption]
  public string GetUsage(string verb)
  {
    return HelpText.AutoBuild(this, verb);
  }
}

this文档中(在上一部分中)说:

  

...如果是,解析器也会将null传递给主类GetUsage(字符串)   用户请求帮助索引:

     

$ git help

     如果用户明确请求,则使用

或verb命令   关于如何使用特定动词的说明:

     

$ git help commit

     

...

我尝试键入:MyApp.exe help verb1但只看到基本帮助(好像我键入了错误的动词,或help动词或其他内容)。但我希望看到与指定动词相关的帮助消息。为什么它不起作用?

在您的应用程序中,它的功能是否正常工作?

1 个答案:

答案 0 :(得分:2)

对我而言,它使用上述方法,但只有在没有--help选项的情况下调用我的应用程序(例如MyApp batch)。当我使用MyApp --help batch时,行为就像你所描述的那样。

但是我们似乎无法为help - 选项工作。

编辑:我设法通过修改Commandline.Parser.cs的代码来实现此目的:

private bool TryParseHelpVerb(string[] args, object options, Pair<MethodInfo, HelpVerbOptionAttribute> helpInfo, OptionMap optionMap)
{
    var helpWriter = _settings.HelpWriter;
    if (helpInfo != null && helpWriter != null)
    {
        if (string.Compare(args[0], helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)
        {
            // User explicitly requested help
            var verb = args.FirstOrDefault(); // <----- change this to args[1];
            if (verb != null)
            {
                var verbOption = optionMap[verb];
                if (verbOption != null)
                {
                    if (verbOption.GetValue(options) == null)
                    {
                        // We need to create an instance also to render help
                        verbOption.CreateInstance(options);
                    }
                }
            }
            DisplayHelpVerbText(options, helpInfo, verb);
            return true;
        }
    }

    return false;
}

问题出现在

var verb = args.FirstOrDefault();

由于第一个参数(args[0])被解释为动词或更好,操作(如文档中所述)verb总是help } 这里。因此,我们将args[1]替换为包含实际动词的commit,例如--help

EDIT2:为了使这项工作适用于args[0],我们还应修剪-字符

中的第一个arg(if (string.Compare(args[0].Trim('-'), helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)
{{1}}