2017-05-25 8 views
0

C#コンソールアプリケーション(CLI)でフレームワークをコーディングしたいと思います。詳細は重要ではありません。 わかりません、コマンドをきれいに、そしてまもなく認識する方法。 は、私がスイッチケースで試してみました:コマンドラインインターフェイスを使用したC#フレームワーク

public static void command_recognizing(string command) // random example 
    { 
     string[] tmp_array = command.Split(' '); 
     switch(tmp_array[0]) 
     { 
      case("help"): 
       method_library.help(); // no need argument 
       break; 
      case("time"): 
       method_library.time(); // no need argument 
       break; 
      case("shutdown"): 
       method_library.shutdown(tmp_array); // need argument 
       break; 
      default: 
       Console.WriteLine("Error! {0} is not a known command!",tmp_array[0]); 
       break; 
     } 
    } 

は私もしようとした場合、他:私は、文字列配列内のコマンドを保存しようとした

 public static void command_recognizing(string command) // random example 
    { 
     string[] tmp_array = command.Split(' '); 
     if(command.Contains("help")) 
     { 
      method_library.help(); // no need argument 
     } 
     else if(command.Contains("time")) 
     { 
      method_library.time(); // no need argument 
     } 
     else if(command.Contains("shutdown")) 
     { 
      method_library.shutdown(tmp_array); // need argument 
     } 
     else 
     { 
      Console.WriteLine("Error! {0} is not a known command!",tmp_array[0]); 
     } 
    } 

、まだ長いと醜い、同じ。

コマンドの認識をより短く、よりクリーンで簡単にする方法はありますか? 私の英語を忘れないでください。私を修正しても構いません!

+0

この記事を見てみましょう –

+0

"インタプリタを書く方法のC#" をグーグルで試してみてください:https://stackoverflow.com/questions/673113/poor-mans-lexer-for-c-sharp –

+0

Nuget> CommandLineParser –

答えて

0

Reflectionを使用してクラスのメソッドを実行できます。

void Main() { 
    var cmd = new Commands(); 

    while (!cmd.Exitting) { 
     var cmdline = Console.ReadLine(); 
     var cmdargs = Regex.Split(cmdline.Trim(), @"\s+"); 
     if (!cmd.TryInvokeMember(cmdargs[0], cmdargs.Skip(1).ToArray())) 
      Console.WriteLine($"Unknown command: {cmdargs[0]}"); 
    } 
} 

// Define other methods and classes here 
public class Commands { 
    public bool Exitting { get; private set; } 

    public Commands() { 
     Exitting = false; 
    } 

    public void exit() { 
     Exitting = true; 
    } 

    public int sum(object[] args) { 
     return args.Select(s => Convert.ToInt32(s)).Sum(); 
    } 

    public bool TryInvokeMember(string methodName, object[] args) { 
     var method = typeof(Commands).GetMethod(methodName.ToLower()); 

     if (method != null) { 
      object res; 
      if (method.GetParameters().Length > 0) 
       res = method.Invoke(this, new object[] { args }); 
      else 
       res = method.Invoke(this, new object[0]); 

      if (method.ReturnType != typeof(void)) 
       Console.WriteLine(res.ToString()); 

      return true; 
     } 
     else 
      return false; 
    } 
} 
+0

NetMageあなたは素晴らしいです、私は、あなたの助けがどれだけ大きかったかを書き留めることができません。まさに私が欲しいものです。 – Oteg

+0

NetMageのおかげで、私のフレームワークは成長し始めました。コアは3000行のコード(Not Ready)しか持っていません。もしあなたが助けなかったら、コアは4〜5千のコード行でなければなりません。 – Oteg

+0

私は主に私のCLIプログラムをPerlで書いていますが(自分の仕事を助けるためにフロントエンドをCisco CLIに書いています)、CLIを作成するのは趣味でした。あなたを助けてくれてうれしいです。 – NetMage

関連する問題