2011-11-16 30 views
20

Tôi muốn có thể lưu trữ các phương thức tĩnh khác nhau trong Danh sách và sau đó tìm kiếm chúng và tự động gọi chúng.danh sách các chức năng động và tự động gọi chúng

Mỗi phòng trong số các phương pháp tĩnh có số khác nhau của args, chủng loại và giá trị lợi nhuận

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

Tôi muốn có một danh sách mà tôi có thể thêm chúng tất cả để:

List<dynamic> list 

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

và sau:

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

Làm cách nào để thực hiện điều này trong C# 4?

+2

+1, một loại câu hỏi khác. –

+0

+1, tôi thích điều đó – Dennis

+1

Điều bạn đang tìm kiếm là [mẫu lệnh] (http://en.wikipedia.org/wiki/Command_pattern). Google cùng với 'C#' và bạn nên được thiết lập. –

Trả lời

20

Bạn có thể tạo danh sách các cá thể đại biểu, sử dụng loại đại biểu phù hợp cho từng phương pháp.

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, để có câu trả lời hay hơn. –

+0

cảm ơn, kỹ thuật này hoạt động hoàn hảo! –

3

Bạn thực sự không cần sức mạnh của dynamic đây, bạn có thể làm với đơn giản List<object>:

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); 
    } 
} 

(tốt, bạn cần một diễn viên, nhưng bạn cần phải bằng cách nào đó biết được chữ ký của từng phương thức được lưu trữ)

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); 
Các vấn đề liên quan