代码之家  ›  专栏  ›  技术社区  ›  user3587624

CommandLineParser库-如何将一个选项的输出用于下一个选项

  •  0
  • user3587624  · 技术社区  · 7 年前

    我正在阅读CommandLineParser文档,我对此处的功能设计方式非常感兴趣:

    CommandLine for verbs

    MyApp.exe-a val1-b val2-c-d

    我试图实现的是,如果命令行应用程序中存在-c,我希望得到 -a val1-b val2 -c

    在这种情况下:

    int Main(string[] args) {
      return CommandLine.Parser.Default.ParseArguments<AddOptions, CommitOptions, CloneOptions>(args)
        .MapResult(
          (AddOptions opts) => RunAddAndReturnExitCode(opts),
          (CommitOptions opts) => RunCommitAndReturnExitCode(opts), 
          errs => 1);
    }
    

    RunAddAndReturnExitCode(opts)

    我真的很喜欢动词的设计,因为它保持了代码的整洁。

    0 回复  |  直到 7 年前
        1
  •  0
  •   stlawrence    5 年前

    如果使用命名静态方法,则不需要匿名委托。

    static int Main(string[] args)
    {
        return Parser.Default.ParseArguments<SubmitProcessOptions, CancelProcessOptions, GetProcessOptions>(args).MapResult<SubmitProcessOptions, CancelProcessOptions, GetProcessOptions, int>(RunSubmitProcess, RunCancelProcess, RunGetProcess, HandleParseError);
    }
    
    static int RunSubmitProcess(SubmitProcessOptions submitProcessOptions)
    {
        Console.WriteLine($"ProcessKey: {submitProcessOptions.ProcessKey}");
        foreach (var parameter in submitProcessOptions.Parameters)
        {
            Console.WriteLine($"Parameter: {parameter}");
        }
        return 0;
    }
    
    static int RunCancelProcess(CancelProcessOptions cancelProcessOptions)
    {
        Console.WriteLine($"ProcessKey: {cancelProcessOptions.ProcessKey}");
        return 0;
    }
    
    static int RunGetProcess(GetProcessOptions getProcessOptions)
    {
        Console.WriteLine($"ProcessKey: {getProcessOptions.ProcessKey}");
        return 0;
    }
    
    static int HandleParseError(IEnumerable<Error> errs)
    {
        //handle errors
        return 1;
    }