2016-07-18 9 views
1

コマンド用の構造体が必要です。コマンドの名前と、そのコマンドが呼び出されたときに実行される関数へのポインタを含みます。未知の型の代理人を含む構造体

public struct Command { 
     public string name; 
     public delegate commandDelegate(); 
    } 

デリゲートにはタイプがないため、これは機能しません。一部のコマンドの機能は無効になり、一部の機能は値を返します。彼らは議論の数も変わるだろう。

私はこのようなもので、私のコマンドリストを占めるように期待していた。

commands.Add(new Command { name = "exit", commandDelegate = new delegate void commandHelp(List<Command> commandList) }); 

これは言う、私はそれをの署名と一致したvoid型を、与えているので、私は、理解していないと予想タイプcommandListメソッドは次のとおりです。

public static void commandHelp(List<Command> commandList) { 
      Console.Write("\n"); 
      foreach (Command x in commandList) { 
       Console.WriteLine("{0,-10}{1,-50}", x.name, "description"); 
      }   

明らかに、私はこれについてどうやって行くのか分かりません。可能であれば、私はこの方法でやりたいのですが、私はC#言語の機能を習得しようとしているだけです。

答えて

2

あなたCommand定義は次のようになります。そして、あなたとあなたのリストにCommand Sを追加することができます

public struct Command { 
    public string name; 
    public Delegate commandDelegate; 
} 

:デリゲートを実行するには

commands.Add(new Command { 
    name = "exit", 
    commandDelegate = new Action<List<Command>>(commandHelp) 
}); 

、あなたは、例えば、引数でDynamicInvokeを使用することができます

commands[0].commandDelegate.DynamicInvoke(new List<Command> { }); 
+0

この機能はどのように実行しますか?私はコマンド[0] .commandDelegate()を試した。しかし、これはcommandDelegateが呼び出せないメンバーであると言います。 –

+0

@JohnSmith - 更新を参照してください。 – Lee

+0

'Command'に 'DynamicInvoke'の定義が含まれておらず、 'Command'タイプの最初の引数を受け入れる拡張メソッド 'DynamicInvoke'が見つかりませんでした。実行中の行にcommandDelegateを指定するにはどうすればいいですか? –

関連する問題