API синтаксического анализа командной строки из библиотеки TestAPI - Команды Type-Safe, как - PullRequest
0 голосов
/ 31 марта 2010

Библиотека на

http://testapi.codeplex.com/

Выдержка из

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

Третий распространенный подход - формирование строго типизированных команд из параметров командной строки. Это распространено в случаях, когда командная строка выглядит следующим образом:

some-exe  COMMAND  parameters-to-the-command

В этом случае синтаксический анализ немного более сложен:

  1. Создайте один класс для каждой поддерживаемой команды, которая наследуется от абстрактного базового класса Command и реализует ожидаемый метод Execute.
  2. Передать ожидаемую команду вместе с аргументами командной строки в CommandLineParser.ParseCommand - метод возвратит строго типизированный экземпляр Command, который может быть Execute () - d.

    // ПРИМЕР № 3: // Пример синтаксического анализа следующей командной строки: // Test.exe run / runId = 10 / подробный // В этом конкретном случае у нас есть фактическая команда в командной строке («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» становится экземпляром класса RunCommand, «walk» становится классом WalkCommand и так далее). Это можно сделать с помощью последней версии? Кроме того, то, что я скачал из codeplex, не работает так, как описано выше, и не принимает самый первый параметр без косой черты. Поэтому, если используется отражение, я должен передать имя команды в качестве обычного параметра, а затем выполнить многоэтапное определение имени класса, создать экземпляр с помощью отражения и только затем анализировать другие аргументы с помощью ParseArguments.

1 Ответ

0 голосов
/ 16 июня 2010

MicMit, Пример в моем блоге был на самом деле ошибочным. С тех пор я исправил это.

По сути, то, что вы делаете: 1. Разберите 1-й аргумент (имя команды), чтобы выяснить, какую команду вам нужно создать 2. создать целевую команду, а затем передать ей остальную часть списка аргументов. 3. выполнить команду

т.е. в вашем главном вы бы сделали что-то вроде следующего ...

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();
}

Надеюсь, это поможет.

...