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

从testapi库解析api的命令行-类型安全命令

  •  0
  • MicMit  · 技术社区  · 15 年前

    图书馆

    http://testapi.codeplex.com/

    用法摘录自

    http://blogs.msdn.com/ivo_manolov/archive/2008/12/17/9230331.aspx

    第三种常见的方法是从命令行参数形成强类型命令。当命令行如下所示时,这种情况很常见:

    some-exe  COMMAND  parameters-to-the-command
    

    本例中的解析稍微复杂一些:

    1. 为每个支持的命令创建一个类,该类从命令抽象基类派生并实现预期的执行方法。
    2. 向commandlineparser.parsecommand传递期望的命令和命令行参数–该方法将返回一个可以执行的强类型命令实例()-d。

      //example 3://用于解析以下命令行的示例: //test.exe运行/runid=10/verbose //在这个特殊的例子中,我们在命令行上有一个实际的命令(run),我们希望它能够有效地反序列化和执行。

       public class   RunCommand : Command
       { 
       bool?  Verbose { get; set; } 
       int? RunId { get; set; }
       public override void Execute()
          {
         // Implement your "run" execution logic here.
          }
       }
        Command c = new RunCommand();
        CommandLineParser.ParseArguments(c, args);
        c.Execute();
      

    ============================

    如果我们在解析参数之前实例化特定的类,我就不明白命令行参数“run”是什么意思,它是第一个参数。我以为这个想法是基于命令行参数实例化和执行命令/类(“run”参数变成实例run command类,“walk”变成walkcommand类等等)。能用最新版本吗?此外,我从codeplex下载的内容并不像上面描述的那样工作,并且不接受没有斜线的第一个参数。因此,如果使用反射,我必须像通常的参数一样传递命令名,然后执行多步骤确定类名,通过反射实例化,然后通过parseArguments解析其他参数。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Ivo    15 年前

    MicMit 我博客上的例子实际上是有缺陷的。我已经改正了。

    实质上,你所做的是: 1。分析第一个参数(命令名)以找出需要实例化的命令 2。实例化目标命令,然后将参数列表的其余部分传递给它。 三。执行命令

    也就是说,在你的主体中,你会做如下的事情…

    if (String.Compare(args[0], "run", StringComparison.InvariantCultureIgnoreCase) == 0)
    {
        Command c = new RunCommand();
        c.ParseArguments(args.Skip(1)); // or CommandLineParser.ParseArguments(c, args.Skip(1))
        c.Execute();
    }
    

    希望能有所帮助。