2011-01-05 8 views
6

この質問が他の場所で回答されていて、「Hello World」の例ではないGoogleを介して何かを見つけることができないかどうかはわかりません...私はC# .NET 4.0。'高度な'コンソールアプリケーション

私は、オープンし、テキストを表示し、コマンドが特定のビジネスロジックを実行するコマンドの入力を待つコンソールアプリケーションを開発しようとしています。

例:ユーザーがアプリケーションを開いて「ヘルプ」と入力すると、さまざまなステートメントなどを表示したいと思います。ユーザー入力用の「イベントハンドラー」をコーディングする方法がわかりません。

これはうまくいけばうまくいきます。どんな助けでも大歓迎です! 乾杯。

+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

インターフェイスはちょうどどのメソッドがセラニーズオブジェクトを持つべきかを指定します。その場所で、インターフェイスから継承するいくつかの異なるオブジェクトを定義できます。あなたのパーサーがあなたのためにそれらのオブジェクトを作成するようにしてください。あなたはあなたが気に入ったものにインターフェイスを変更することができます、私はちょうどプログラムを終了する必要がある場合に 'true'を返す単純な' Execute'で行いました。サンプル。 –

0

これは簡単です。Console.WriteLineConsole.ReadLine()の方法を使用してください。 ReadLineから文字列を取得します。あなたは既知の/予想された入力に対してこれを検証する恐ろしいif文を持つことができます。ルックアップテーブルを持つ方が良いでしょう。最も洗練されたのは、パーサーを書くことです。それは実際にどのように入力が複雑になるかによって異なります。

+0

しかし、Console.ReadLine()メソッドでは、どのように答えの異なる順列をコーディングするのですか?たとえば、Console.ReadLine()、if(Console.ReadLine()== "help" {}など) – keynesiancross

0

Console.WriteLineConsole.ReadLineConsole.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

あなたの機能はすべての仕事をしているので、良いデザインではありません。あなたはすべての部分が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); 
}