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

gek*_*k0n 8 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

文档中(在最后一部分中)说:

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

$ git帮助

或者如果用户明确请求如何使用特定动词的说明,则使用verb命令:

$ git help commit

...

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

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

Him*_*ere 2

对我来说,它可以使用上述方法,但前提是我在不使用--help- 选项的情况下调用我的应用程序(例如MyApp batch)。当我使用时,MyApp --help batch行为正如您所描述的那样。

\n\n

然而,我们似乎可以\xc2\xb4t 得到同样的结果以用于help- 选项。

\n\n

编辑:我设法通过修改Commandline.Parser.cs以下代码来使其工作:

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

问题出现在该行

\n\n
var verb = args.FirstOrDefault();\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

EDIT2:为了使这项工作也适用,我们还应该从-character中--help修剪第一个 arg ( args[0])-

\n\n
if (string.Compare(args[0].Trim('-'), helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)\n
Run Code Online (Sandbox Code Playgroud)\n