2010-03-31 27 views
18

Giả sử tôi muốn lưu trữ một nhóm các con trỏ hàm trong một List<(*func)>, và sau đó gọi chúng, có lẽ ngay cả với các tham số ... Giống như nếu tôi được lưu trữ trong một Dict<(*func), object[] params> tôi có thể gọi func với các tham số? Làm thế nào tôi sẽ làm điều này?Làm thế nào để lưu trữ một con trỏ hàm trong C#

+3

Dict <(* func), đối tượng [] params> trông giống như một ý tưởng tồi nhưng đó chỉ là tôi. –

+0

Tôi sử dụng nó để "chuyển đổi" trên các loại, sử dụng Loại làm khóa và chức năng làm mã. Hoạt động tuyệt vời khi "chuyển đổi (typeof (chuỗi))" sẽ không ... –

Trả lời

30

.NET sử dụng đại biểu thay vì con trỏ hàm. Bạn có thể lưu trữ một cá thể đại biểu giống như bất kỳ loại đối tượng nào khác, trong từ điển hoặc bằng cách khác.

Xem Delegates từ Hướng dẫn lập trình C# trên MSDN.

8

Hãy xem tài liệu C# về đại biểu, tương đương C# của con trỏ hàm (có thể là con trỏ hàm đơn giản hoặc được curried một lần để cung cấp tham số này). Có rất nhiều thông tin hữu ích cho bạn.

+2

Tài liệu C# nào về đại biểu? Liên kết sẽ hữu ích. – sblom

2

Có một vài cách bạn có thể thực hiện việc này. Bạn có thể làm điều đó như những người khác đã đề xuất thông qua việc sử dụng các đại biểu. Nhưng để làm cho từ điển hoạt động, tất cả chúng đều cần chữ ký giống nhau.

var funcs = new Dictionary<Action<object[]>, object[]>(); 

Hoặc nếu họ có chữ ký khác nhau mà bạn có thể sử dụng phương pháp phản ánh thực tế, giống như sau

var funcs = new Dictionary<MethodInfo, object[]>(); 
22

Bạn hoàn toàn có thể có một cuốn từ điển các chức năng:

Dictionary<string, Action<T>> actionList = new Dictionary<string, Action<T>>(); 
Dictionary<string, Func<string>> functionList = new Dictionary<string, Func<string>>(); 

actionList.Add("firstFunction",()=>{/*do something;*/}); 
functionList.Add("firstFunction",()=>{return "it's a string!";}); 

Bạn có thể sau đó gọi các phương pháp như sau:

string s = functionList["firstFunction"].Invoke(); 
+8

Bạn cũng có thể gọi trực tiếp cho họ: 'functionList [" firstFunction "]()' –

2

Sử dụng ether một đại biểu hoặc một sự kiện (tùy thuộc vào cách sử dụng).

+0

Làm thế nào bạn có thể lưu trữ một sự kiện trong một bộ sưu tập? – svick

+0

@svick, Thuộc tính sự kiện bị lỗi thời có được và thiết lập, chúng có thêm và xóa, bởi vì các sự kiện giữ một danh sách các trình xử lý. –

-1

Nếu bạn chỉ lưu trữ xử lý sự kiện sau đó ...

Dictionary<string, EventHandler> dictEvents = new Dictionary<string, EventHandler>(); 
dictEvents.Add("Event1", someEventHandler); 

... 

protected void someEventHandler(object sender, EventArgs e) 
{ 
    //Do something. 
} 

Edit:

  • tôi đặt này ở đây vì tôi đã tìm kiếm một cách để làm điều gì đó tương tự như khi tôi tìm thấy bài viết này . Tuy nhiên, các giải pháp trong bài đăng này không hoàn toàn phù hợp với hoàn cảnh của tôi, vì vậy tôi nghĩ rằng tôi sẽ chia sẻ những gì đã làm việc cho tôi.
+0

Điều gì làm cho bạn nghĩ rằng câu hỏi là về xử lý sự kiện? – svick

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