2011-01-05 3 views
6

Я не уверен, что на этот вопрос был дан ответ в другом месте, и я не могу найти ничего через Google, который не является примером «Hello World» ... Я кодирую в C# .NET 4.0.«Продвинутое» консольное приложение

Я пытаюсь разработать консольное приложение, которое откроет, отобразит текст, а затем дождитесь, когда пользователь будет вводить команды, где команды будут запускать определенную бизнес-логику.

Например: если пользователь открывает приложение и набирает «help», я хочу отобразить несколько операторов и т. Д. И т. Д. Я не уверен, как кодировать «обработчик событий» для ввода пользователем.

Надеюсь, это имеет смысл. Любая помощь приветствуется! Cheers.

+2

код простое приложение, которое говорит: «Плохая команда» независимо от того, какие типы пользователей. Затем разместите свой код и уточните свой вопрос. – Jon

+0

Я определенно хотел бы, но у меня действительно нет кода, потому что я не уверен, с чего начать ... – keynesiancross

ответ

21

Для этого требуется несколько шагов, но это не должно быть так сложно. Сначала вам нужен какой-то парсер, который разбирает то, что вы пишете. Чтобы прочитать каждую команду, просто используйте var command = Console.ReadLine(), а затем проанализируйте эту строку. И выполнить команду ... Основная логика должна иметь базу перспективное это (вид):

public static void Main(string[] args) 
{ 
    var exit = false; 
    while(exit == false) 
    { 
     Console.WriteLine(); 
     Console.WriteLine("Enter command (help to display help): "); 
     var command = Parser.Parse(Console.ReadLine()); 
     exit = command.Execute(); 
    } 
} 

Род, вы, вероятно, можете изменить это, чтобы быть более сложными.

Код для Parser и команды является своего рода прямо вперед:

public interface ICommand 
{ 
    bool Execute(); 
} 

public class ExitCommand : ICommand 
{ 
    public bool Execute() 
    { 
     return true; 
    } 
} 

public static Class Parser 
{ 
    public static ICommand Parse(string commandString) { 
     // Parse your string and create Command object 
     var commandParts = commandString.Split(' ').ToList(); 
     var commandName = commandParts[0]; 
     var args = commandParts.Skip(1).ToList(); // the arguments is after the command 
     switch(commandName) 
     { 
      // Create command based on CommandName (and maybe arguments) 
      case "exit": return new ExitCommand(); 
       . 
       . 
       . 
       . 
     } 
    } 
} 
+1

Отлично, спасибо. Это определенно то, что я ищу – keynesiancross

+0

Извините, как работает интерфейс этот случай? Я не работал с интерфейсами много, так что это может быть моя проблема ... – keynesiancross

+0

Интерфейс просто указывает, какой метод должен иметь объект ceratin. С помощью этого вы можете определить несколько разных объектов, которые наследуются от интерфейса и пусть ваш парсер создаст эти объекты для вас. Вы можете изменить интерфейс на то, что когда-либо чувствуете, я просто сделал это с помощью простого 'Execute', который возвращает' true', если программа должна выйти. Я могу обновить с помощью простой команды и образец –

0

Это достаточно просто, просто используйте методы Console.WriteLine и Console.ReadLine(). Из ReadLine вы получите строку. У вас может быть ужасное утверждение if, подтверждающее это против известных/ожидаемых входов. Лучше было бы иметь таблицу поиска. Наиболее сложным было бы написать парсер. Это зависит от того, насколько сложными могут быть входные данные.

+0

, но с помощью метода Console.ReadLine(), как я тогда кодирую различные перестановки ответов и т. Д.? Например, Console.ReadLine(), если (Console.ReadLine() == "help) {} и т. Д. И т. Д. – keynesiancross

0

Console.WriteLineConsole.ReadLine и Console.ReadKey ваши друзья. ReadLine и ReadKey ждут ввода пользователем. string[] args будет иметь все ваши параметры, такие как «помощь» в них. Массив создается путем разделения аргументов командной строки пробелами.

0
switch (Console.ReadLine()) 
{ 
    case "Help": 
     // print help 
     break; 

    case "Other Command": 
     // do other command 
     break; 

    // etc. 

    default: 
     Console.WriteLine("Bad Command"); 
     break; 
} 

Если вы хотите, чтобы разобрать команды, которые имеют другие вещи в них, как параметры, например, «манипулировать file.txt», то это само по себе не будет работать. Но вы можете, например, использовать String.Split для разделения ввода на команду и аргументы.

0

Это очень упрощенно, но может удовлетворить ваши потребности.

// somewhere to store the input 
string userInput=""; 

// loop until the exit command comes in. 
while (userInput != "exit") 
{ 
    // display a prompt 
    Console.Write("> "); 
    // get the input 
    userInput = Console.ReadLine().ToLower(); 

    // Branch based on the input 
    switch (userInput) 
    { 
     case "exit": 
      break; 

     case "help": 
     { 
      DisplayHelp(); 
      break; 
     } 

     case "option1": 
     { 
      DoOption1(); 
      break; 
     } 

     // Give the user every opportunity to invoke your help system :) 
     default: 
     { 
      Console.WriteLine ("\"{0}\" is not a recognized command. Type \"help\" for options.", userInput); 
      break; 
     } 
    } 
} 
1

Образец:

static void Main(string[] args) 
    { 
     Console.WriteLine("Welcome to test console app, type help to get some help!"); 

     while (true) 
     { 
      string input = Console.ReadLine(); 

      int commandEndIndex = input.IndexOf(' '); 

      string command = string.Empty; 
      string commandParameters = string.Empty; 

      if (commandEndIndex > -1) 
      { 
       command = input.Substring(0, commandEndIndex); 
       commandParameters = input.Substring(commandEndIndex + 1, input.Length - commandEndIndex - 1); 
      } 
      else 
      { 
       command = input; 
      } 

      command = command.ToUpper(); 

      switch (command) 
      { 
       case "EXIT": 
        { 
         return; 
        } 
       case "HELP": 
        { 
         Console.WriteLine("- enter EXIT to exit this application"); 
         Console.WriteLine("- enter CLS to clear the screen"); 
         Console.WriteLine("- enter FORECOLOR value to change text fore color (sample: FORECOLOR Red) "); 
         Console.WriteLine("- enter BACKCOLOR value to change text back color (sample: FORECOLOR Green) "); 
         break; 
        } 
       case "CLS": 
        { 
         Console.Clear(); 
         break; 
        } 

       case "FORECOLOR": 
        { 
         try 
         { 
          Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), commandParameters); 
         } 
         catch 
         { 
          Console.WriteLine("!!! Parameter not valid"); 
         } 

         break; 
        } 
       case "BACKCOLOR": 
        { 
         try 
         { 
          Console.BackgroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), commandParameters); 
         } 
         catch 
         { 
          Console.WriteLine("!!! Parameter not valid"); 
         } 

         break; 
        } 
       default: 
        { 
         Console.WriteLine("!!! Bad command"); 
         break; 
        } 
      } 
     } 
    } 
+1

, что не является хорошим дизайном, так как ваша функция выполняет ВСЕ работу. Вы должны делиться, так что каждая часть несет одну ответственность. –

+0

Я согласен с этим, но я понял, что он ищет код, из которого он может учиться, и это не слишком сложно. Вы правы, что логику нужно разделить. В конце обоих образцов ваш и мой дает одинаковый результат. – HABJAN

+1

В конце концов, это точно так же, но я не думаю, что мое решение более сложное, и важно, чтобы вы научились правильно поступать ... хотя мой, вероятно, не подходит для всех но дизайн - это то, о чем вы должны думать. Я даже считаю мое решение более легким, так как оно намного «свободно», когда вы его читаете, и вы пропустите все детали, если они вам не нужны. На высоком уровне это только, команда чтения, проанализировать команду и выполнить последнюю команду. То есть вы можете пропустить детали в том, как команда разбирается и как она выполняется. –

1

Я знаю, что это старый вопрос, но я искал ответ тоже. Я не смог найти простой, поэтому я создал InteractivePrompt. Он доступен как NuGet Package, и вы можете легко расширить код, который находится на GitHub. Он также содержит историю для текущего сеанса.

Функциональность в вопросе может быть реализован таким образом, с InteractivePrompt:

static string Help(string strCmd) 
{ 
    // ... logic 
    return "Help text"; 
} 
static string OtherMethod(string strCmd) 
{ 
    // ... more logic 
    return "Other method"; 
} 
static void Main(string[] args) 
{ 
    var prompt = "> "; 
    var startupMsg = "BizLogic Interpreter"; 
    InteractivePrompt.Run(
     ((strCmd, listCmd) => 
     { 
      string result; 
      switch (strCmd.ToLower()) 
      { 
       case "help": 
        result = Help(strCmd); 
        break; 
       case "othermethod": 
        result = OtherMethod(strCmd); 
        break; 
       default: 
        result = "I'm sorry, I don't recognize that command."; 
        break; 
      } 

      return result + Environment.NewLine; 
     }), prompt, startupMsg); 
} 
Смежные вопросы