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#
Trả lời
.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.
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.
Tài liệu C# nào về đại biểu? Liên kết sẽ hữu ích. – sblom
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[]>();
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();
Bạn cũng có thể gọi trực tiếp cho họ: 'functionList [" firstFunction "]()' –
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).
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
@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ý. –
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.
Điều gì làm cho bạn nghĩ rằng câu hỏi là về xử lý sự kiện? – svick
- 1. Làm cách nào để lưu trữ một con trỏ hàm trong cấu trúc?
- 2. Lưu trữ con trỏ hàm trong std :: chức năng
- 3. Con trỏ hàm trong C#
- 4. Con trỏ hàm trong mục tiêu C
- 5. Tại sao không thể lưu trữ một con trỏ hàm của một lớp cơ sở?
- 6. Cú pháp cho một con trỏ tới một hàm trả về một con trỏ hàm trong C
- 7. Con trỏ C++. Làm thế nào để gán giá trị cho một struct con trỏ?
- 8. Con trỏ hàm C++ làm tham số
- 9. Làm thế nào để khai báo con trỏ hàm trong header và c-file?
- 10. Làm thế nào để tăng một địa chỉ con trỏ và giá trị của con trỏ?
- 11. Con trỏ hàm được đúc trong C++
- 12. Lưu trữ địa chỉ của con trỏ trong một chữ ký không dấu trong C
- 13. Mảng con trỏ hàm trong C
- 14. Cách lấy tên hàm từ con trỏ hàm trong C#?
- 15. lấy con trỏ hàm 'ldftn' trong C#
- 16. Lưu con trỏ vào hàm được chỉ định trong Delphi
- 17. Gọi C++ con trỏ hàm từ C#
- 18. Nhiều shared_ptr lưu trữ cùng một con trỏ
- 19. Làm thế nào để trở lại một con trỏ Submodule Git đến cam kết được lưu trữ trong kho chứa?
- 20. Làm thế nào để lưu một thủ tục lưu trữ?
- 21. Scala: Làm thế nào để "lưu trữ" một hàm trong một var?
- 22. Làm thế nào để loại bỏ các con trỏ void
- 23. chuyển functor làm con trỏ hàm
- 24. Trả về con trỏ từ hàm C
- 25. Làm thế nào để có một con trỏ char như một tham số ngoài cho hàm C++
- 26. Làm thế nào để xử lý con trỏ 'này' trong hàm tạo?
- 27. C con trỏ Câu
- 28. Hàm con trỏ tới hàm __attribute __ ((const))?
- 29. Gán con trỏ cho một hàm địa chỉ của con trỏ tới đối tượng hàm
- 30. Làm thế nào để bạn vượt qua một con trỏ hàm thành viên?
Dict <(* func), đối tượng [] params> trông giống như một ý tưởng tồi nhưng đó chỉ là tôi. –
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 ... –