この質問が他の場所で回答されているかどうかはわかりません。また、「HelloWorld」の例ではないものをGoogleで見つけることができないようです...私はC#.NET4.0でコーディングしています。
開いてテキストを表示し、ユーザーがコマンドを入力するのを待つコンソールアプリケーションを開発しようとしています。コマンドは、特定のビジネスロジックを実行します。
例:ユーザーがアプリケーションを開いて「help」と入力した場合、いくつかのステートメントなどを表示したいのですが、ユーザー入力用の「イベントハンドラー」をコーディングする方法がわかりません。
うまくいけば、これは理にかなっています。どんな助けでも大歓迎です!乾杯。
これを達成するにはいくつかの手順が必要ですが、それほど難しくはありません。まず、書いたものを解析するある種のパーサーが必要です。各コマンドを読み取るには、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();
.
.
.
.
}
}
}
これは古い質問だと思いますが、私も答えを探していました。簡単なものが見つからなかったので、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);
}
これは非常に簡単です。_Console.WriteLine
_メソッドとConsole.ReadLine()
メソッドを使用するだけです。 ReadLineから文字列を取得します。既知の/予想される入力に対してこれを検証する恐ろしいifステートメントがある可能性があります。ルックアップテーブルを用意することをお勧めします。最も洗練されているのは、パーサーを作成することです。それは、入力がどれほど複雑になるかによって異なります。
Console.WriteLine
Console.ReadLine
およびConsole.ReadKey
はあなたの友達です。 ReadLineとReadKeyはユーザー入力を待ちます。 string[] args
には、「ヘルプ」などのすべてのパラメータが含まれます。配列は、コマンドライン引数をスペースで区切って作成されます。
switch (Console.ReadLine())
{
case "Help":
// print help
break;
case "Other Command":
// do other command
break;
// etc.
default:
Console.WriteLine("Bad Command");
break;
}
「manipulatefile.txt」など、パラメータなどの他のものが含まれているコマンドを解析しようとしている場合、これだけでは機能しません。ただし、たとえばString.Split
を使用して、入力をコマンドと引数に分けることができます。
これは非常に単純ですが、ニーズを満たす可能性があります。
// 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;
}
}
}
サンプル:
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;
}
}
}
}