2011-11-16 11 views
20

私はListにさまざまな静的メソッドを格納し、後でそれを探して動的に呼び出せるようにしたいと考えています。私は、私はそれらをすべて追加することができます一覧したいのですが動的関数のリストとそれらを動的に呼び出す

静的メソッドのそれぞれは、引数の異なる数を持つタイプとリターンが

static int X(int,int).... 
static string Y(int,int,string) 

値:

List<dynamic> list 

list.Add(X); 
list.Add(Y); 

をし、後で:

dynamic result = list[0](1,2); 
dynamic result2 = list[1](5,10,"hello") 

C#4でこれを行うには?

+2

+1、別の種類の質問。 –

+0

+1、私はそれが好きです – Dennis

+1

あなたが探しているのは[コマンドパターン](http://ja.wikipedia.org/wiki/Command_pattern)です。 Googleは 'c# 'と一緒にそれを設定する必要があります。より良い答えのためには –

答えて

20

各メソッドに適切な委任型を使用して、委任インスタンスのリストを作成できます。

var list = new List<dynamic> 
      { 
       new Func<int, int, int> (X), 
       new Func<int, int, string, string> (Y) 
      }; 

dynamic result = list[0](1, 2); // like X(1, 2) 
dynamic result2 = list[1](5, 10, "hello") // like Y(5, 10, "hello") 
+2

+1。 –

+0

ありがとう、このテクニックは完璧に働いた! –

3

あなたが実際にあなたが簡単なList<object>で行うことができ、ここでdynamicの力を必要としない:

class Program 
{ 
    static int f(int x) { return x + 1; } 
    static void g(int x, int y) { Console.WriteLine("hallo"); } 
    static void Main(string[] args) 
    { 
     List<object> l = new List<object>(); 
     l.Add((Func<int, int>)f); 
     l.Add((Action<int, int>)g); 
     int r = ((Func<int, int>)l[0])(5); 
     ((Action<int, int>)l[1])(0, 0); 
    } 
} 

(まあ、あなたがキャストを必要としていますが、何らかの形での署名を知っておく必要がありますとにかく各格納されたメソッド)

2
List<dynamic> list = new List<dynamic>(); 
     Action<int, int> myFunc = (int x, int y) => Console.WriteLine("{0}, {1}", x, y); 
     Action<int, int> myFunc2 = (int x, int y) => Console.WriteLine("{0}, {1}", x, y); 
     list.Add(myFunc); 
     list.Add(myFunc2); 

     (list[0])(5, 6); 
関連する問題