Tôi không hiểu, tại sao lại sử dụng MethodBags động khi tôi có thể sử dụng ExpandoObject? Tôi đang thiếu gì ở đây?C# 4.0: Tại sao chọn MethodBag khi có ExpandoObject?
Trả lời
Lưu ý nhanh: đối với những người không biết, túi phương pháp động là kỹ thuật để thêm phương thức động vào đối tượng. Bill Wagner mô tả nó here với mã nguồn here.
Câu trả lời đơn giản là khái niệm MethodBag chỉ cho bạn thấy một kỹ thuật. Bạn hoàn toàn có thể sử dụng ExpandoObject để làm điều này, nhưng có thể có một thời gian khi bạn muốn viết lớp của riêng bạn mà kế thừa từ System.Dynamic.DynamicObject
. Một ví dụ về điều này có thể là cung cấp một đối tượng JSON, YAML hoặc XML động cho phép bạn tham chiếu dữ liệu của bạn trong dấu chấm-thuộc tính thay vì theo cách truyền thống. Nếu bạn kế thừa từ DynamicObject, bạn có thể thấy rằng bạn cũng muốn cho phép thêm các hàm động vào lớp của bạn. Kỹ thuật MethodBag chỉ cho bạn cách thực hiện điều đó. ExpandoObject chỉ là một ví dụ của một lớp thực hiện kỹ thuật này. ExpandoObject sẽ là tốt cho 95% những gì bạn cần, và kỹ thuật MethodBag cho bạn thấy làm thế nào để tùy chỉnh viết của riêng bạn khi bạn quyết định làm điều đó cho 5% cuối cùng.
Phương pháp Thẻ và triển khai tương tự có xu hướng có một số hạn chế. Nó có thể dễ dàng hơn chỉ để thực hiện lớp học của riêng bạn nếu bạn thấy mình chạy vào những rào chắn này. Cụ thể:
Khó thực hiện trạng thái trong túi phương pháp. (Cây biểu thức không thể chứa các đối tượng được gõ tĩnh là
dynamic
; không có cú pháp tốt để tạo các phương thức dựa vào trạng thái nội bộ trên cùng một đối tượng động.)Chỉ có thể thêm các phương thức công khai. Không có phương pháp ảo, riêng tư, được bảo vệ hoặc trừu tượng nào.
Không thể triển khai giao diện.
Để so sánh, ExpandoObjects
là các lớp học thực sự và phong phú hơn, phong phú hơn. Họ bắt chước chặt chẽ hơn những gì bạn sẽ nhận được miễn phí trong, nói, Ruby hoặc Python.
- 1. Tại sao không có phương sai chung cho các lớp trong C# 4.0?
- 2. Tại sao System.Data.OracleClient không có trong .NET 4.0 Client Profile?
- 3. C# 4.0 Động vs Expando ... chúng phù hợp ở đâu?
- 4. Tại sao INSERT và UPDATE chậm hơn trên Android 4.0?
- 5. Tại sao C# bị ngắt nếu không tùy chọn?
- 6. Tại sao phương thức không đồng bộ C# 4.0 này được gọi?
- 7. Đây có phải là một thông số tùy chọn trình biên dịch C# 4.0 không?
- 8. Tại sao IEquatable T không làm contravariant trong T cho C# 4.0?
- 9. Tại sao C# (4.0) không cho phép đồng và contravariance trong các loại lớp chung?
- 10. Trong c + +, tại sao trình biên dịch chọn hàm không const khi const cũng làm việc?
- 11. Mục tiêu-C: Tại sao chọn nil trước respondsToSelector :? đang
- 12. Tại sao không có Directory.Copy trong C#
- 13. Tại sao ZeroMemory, vv tồn tại khi có memset, vv?
- 14. Tại sao CHỌN 0, ... thay vì CHỌN
- 15. Triển khai ExpandoObject trong Scala
- 16. Tại sao không có ReverseEnumerator trong C#?
- 17. DB SQLite (có WAL) bị khóa khi chuẩn bị một thước đo "chọn" - tại sao?
- 18. C# 4.0 Tham số tùy chọn - Cách chỉ định tham số tùy chọn loại "hướng dẫn"?
- 19. Làm thế nào để mở rộng một đối tượng hiện có trong C# 4.0 bằng cách sử dụng động lực
- 20. Danh sách bên trong ExpandoObject
- 21. Nối tiếp ExpandoObject với ServiceStack.Tiếp theo
- 22. sự khác biệt giữa OptionalAttribute và các thông số tùy chọn trong C# 4.0
- 23. C# 4.0 - Làm thế nào để xử lý chuỗi tùy chọn thông số
- 24. Tại sao có bản sao trước khi chuyển nhượng?
- 25. Tại sao chọn tự! = Nil in -init khi nhắn tin nil không có hiệu lực?
- 26. Có thể tạo cấu trúc cây động bằng ExpandoObject không?
- 27. Chọn Zend OR Symfony? Và tại sao?
- 28. Tại sao có tiền tố "c" trong phiên bản C++ của C libs?
- 29. Lựa chọn chậm trong QTreeView, tại sao?
- 30. Tại sao java có Type khi nó đã có Object?
Cảm ơn. Nhưng tôi nghĩ bạn đã đảo ngược câu hỏi của tôi. Tôi đã hỏi tại sao sử dụng MethodBags khi có ExpandoObject, không phải lý do tại sao sử dụng ExpandoObject khi tôi có thể sử dụng MethodBags. –
@ stimply77, methodbags được giới hạn ở mức nhất định, như john đã nói bạn không thể sử dụng methodbgs nơi bạn muốn triển khai intefaces và các loại cụ thể hơn .. – RameshVel
@ stimpy77: Tôi nghĩ rằng quan điểm của tôi nhiều hơn là không có nhiều lý do, trừ khi bạn hoàn toàn không cần bất cứ điều gì ngoại trừ một vài phương pháp. ExpandoObject có vẻ như lựa chọn trường hợp tổng quát tốt hơn. –