2010-01-16 24 views
5

Tôi có một lớp con của DynamicObject và tôi muốn triển khai thực hiện truyền ngầm cho các kiểu nguyên thủy tương tự như phương thức đúc rõ ràng của DO TryConvert; nghĩa là, không cần viết nhiều hàm operator [type] ngầm định.DynamicObject ẩn đúc

Cách sử dụng:

dynamic myDynamicObject = new MyDynamicObject("1"); 
int sum = 1 + myDynamicObject; // instead of int i = 1 + (int)myDynamicObject; 

Là có thể và nếu như vậy, làm thế nào?

Trả lời

5

Có một số điều đang diễn ra tại đây.

Trước tiên, bạn đang thực hiện thao tác nhị phân. Vì vậy, bạn cần phải ghi đè lên phương thức TryBinaryOperation. Nó sẽ được gọi trước tiên, trước khi chuyển đổi. Sau đó, từ phương thức TryBinaryOperation bạn có thể thực hiện chuyển đổi.

Thứ hai, đối với bất cứ lý do TryBinaryOperation được gọi chỉ khi bạn viết một tuyên bố như thế này:

int sum = myDynamicObject + 1; 

Từ những gì tôi nhìn thấy bây giờ, thứ tự là quan trọng. Tôi sẽ kiểm tra với nhóm DLR cho dù đó là một lỗi hoặc hành vi dự định.

Cập nhật: Nó không phải là lỗi. Để hỗ trợ cả "1 + myDynamicObject" và "myDynamicObject + 1", bạn không chỉ cần TryBinaryOperation, mà còn giống như TryBinaryOperationFromRight, mà DynamicObject hiện tại không có.

+0

Với dàn diễn viên tiềm ẩn trong kịch bản "1 + myDynamicObject", nó sử dụng thao tác bên trái trên loại dàn diễn viên; trong trường hợp này ints operation + (int, int). Nhưng có, TryBinaryOperation chỉ hỗ trợ các hoạt động bên trái. Đó là lý do tại sao phương pháp đúc tương tự như TryConvert cho đúc rõ ràng sẽ rất hữu ích. –

+0

TryConvert trong thực tế hỗ trợ cả ẩn và rõ ràng đúc. Ví dụ, điều này hoạt động tốt: "int sum = myDynamicObject;" nếu bạn ghi đè lên TryConvert. Nhưng khi bạn thực hiện một hoạt động nhị phân (và tôi đoán là một unary là tốt), phương pháp TryConvert không được gọi. Tôi khuyên bạn nên viết thư cho [email protected] và giải thích trường hợp sử dụng của bạn ở đó. Nó có thể là một lỗi hoặc có thể có một số thiết kế hợp lý đằng sau điều này, mà nhóm có thể giải thích tốt hơn tôi. –

3

Nhóm DLR đã trả lời câu hỏi của tôi và nói rằng không thể thực hiện được khi DO là toán hạng bên phải.

Trích dẫn từ câu trả lời: "Quy tắc quan trọng nhất là đối tượng động cần phải là toán hạng bên trái vì giao thức hoạt động động chỉ hoạt động với đối tượng động ở vị trí đó."

Có thể thực hiện quá trình đúc ẩn bên trái thông qua TryBinaryOperation, nhưng bạn cũng phải triển khai các toán tử được hỗ trợ (+, -, ...).