2012-01-12 27 views
10

Hãy xem xét các đoạn mã sau:động LINQ và điều hành quá tải

var vectorTest = new Vector2(1, 2) + new Vector2(3, 4); // Works 

var x = Expression.Parameter(typeof(Vector2), "x"); 
var test = System.Linq.Dynamic 
       .DynamicExpression.ParseLambda(new[] { x }, null, "x = x + x"); 

Chạy nó, tôi nhận được ngoại lệ dưới đây:

System.Linq.Dynamic.ParseException là unhandled bởi người dùng mã nhắn = Toán tử '+' không tương thích với các loại toán hạng 'Vector2' và 'Vector2' Nguồn = DynamicLINQ Vị trí = 6

Làm cách nào để trình phân tích cú pháp 'thấy' quá tải của toán tử + trên loại Vector2?

EDIT: Tôi cũng gặp vấn đề tương tự với toán tử =. Nhìn vào nguồn, tôi có thể thấy lý do tại sao, nó nhìn vào một giao diện đặc biệt liệt kê vô số các phương thức, đối với các loại đơn giản và nếu nó không thể tìm thấy nó, thì nó sẽ làm tăng ngoại lệ. Rắc rối là, loại của tôi (Vector2) không có trong danh sách đó, vì vậy nó sẽ không bao giờ tìm thấy các phương pháp điều hành.

+1

George, tôi đã hoàn nguyên vị trí của mình về việc bạn có nên tạo giao diện _any_ hoặc mở rộng từ một trong các giao diện nhất định hay không. Tôi nghĩ rằng nó sẽ an toàn hơn để mở rộng từ một trong các giao diện thay thế. Có thể hoặc không thể kiểm tra loại bổ sung (chẳng hạn như loại thực sự hỗ trợ bổ sung) trong tương lai hoặc không có điều gì. –

+0

Điểm tốt, cảm ơn; tôi đã thay đổi mã của mình cho phù hợp. –

Trả lời

2

Làm việc với thư viện DynamicLinq, bạn sẽ cần phải thêm chữ ký vào một trong các giao diện chữ ký có trong số System.Linq.Dynamic.ExpressionParser. Nó sẽ chỉ phân tích các hoạt động mà nó nhận ra.

Dường như nó sẽ xem xét tất cả các giao diện riêng được tìm thấy trong ExpressionParser. Chỉ cần thêm một giao diện trong các ExpressionParser và nó có vẻ để ngăn chặn các lỗi.

interface ICustomSignatures 
{ 
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y); 
} 

Chỉ cần để được an toàn (và có thể phù hợp với những mẫu thiết kế), nó có thể được an toàn hơn để thêm vào/mở rộng từ giao diện IAddSignatures.

interface ICustomSignatures : IAddSignatures 
{ 
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y); 
} 
+0

Có thể ngay cả giao diện 'ISubtractSignatures' vì phép trừ là hoạt động hợp lệ trên' Vector2'. –

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