2009-11-23 11 views

Trả lời

5

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.

7

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.

+0

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. –

+0

@ 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

+0

@ 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. –

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