2009-09-20 33 views

Trả lời

16

Bạn có thể viết này, ví dụ

 Action<int> method = j => j++; 
     List<Action<int>> operations = new List<Action<int>>(); 

     operations.Add(method); 
     operations.Add(i => i++); 
+0

Nếu bạn cần một chút linh hoạt hơn một đại biểu cụ thể, hãy thử xem đại biểu được xác định trong câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/1184329/function-pointers -in-c –

0

Đó chắc chắn có thể tạo ra một danh sách của một loại đại biểu cụ thể, như Hành động hoặc Func, hoặc bất kỳ người nào khác. Vì các đại biểu ẩn danh có thể được truyền sang bất kỳ loại đại biểu nào có chữ ký tương thích, bạn có thể tạo danh sách các đại biểu miễn là chúng có chữ ký tương thích.

Tôi không nghĩ rằng việc tạo danh sách đại biểu có nhiều loại chữ ký sẽ được sử dụng nhiều, vì có chữ ký không xác định sẽ khiến cho người đại diện rất khó gọi. Bạn sẽ có thể làm như vậy với sự phản ánh, mặc dù. Trong trường hợp đó, bạn chỉ có thể sử dụng danh sách đối tượng.

3

Sự cố với mã của bạn là bạn đang cố chỉ định một cá thể làm đối số kiểu cho Danh sách.

Action<int> method là một ví dụ, trong khi Action<int> là một loại.

Là một áp phích khác đề cập đến, bạn chỉ cần khai báo loại danh sách là Action<int>, tức là chỉ với thông số loại.

ví dụ:

var myNum = 5; 

var myops = new List<Action<int>>(); 
myops.Add(j => j++); 
myops.Add(j => j++); 

foreach(var method in myops) 
{ 
    Console.WriteLine(method(myNum)); 
} 

// Frowned upon, but fun syntax 

myops.Each(method => method(myNum)); 
+0

Tại sao nó lại cau mày? – recursive

+0

Một số người nghĩ rằng các loại danh sách này không nên được sử dụng với các hoạt động có tác dụng phụ. Mỗi phương pháp như thế này vốn đã có tác dụng phụ. – Joren

+0

@ Joren: Sử dụng các biểu thức LINQ (bao gồm các biểu thức hiểu biết) chỉ vì các tác dụng phụ là có vấn đề, vì bản chất lười biếng của chúng. Nhưng các phương thức nặc danh và các biểu thức lambda không chỉ dành cho LINQ, và không có lý do gì để hạn chế chúng trở thành chức năng thuần túy nói chung. Vì vậy, IMO, việc sử dụng một lambda với 'List .Each()' là một cách tiếp cận tốt. – Richard

Các vấn đề liên quan