2011-11-07 26 views
6

Có cách nào để rút ra các thuộc tính, toán tử và giá trị khớp từ Expression<Func<T>,bool> không? Với ví dụ sau:Làm cách nào để bạn có được các thuộc tính, toán tử và giá trị từ một thuộc tính Expression <Func <T, bool>>?

var customers = GetCustomers(); 
var customerQuery = customers.Where(x=> x.CustomerID == 1 
    && x.CustomerName == "Bob"); // The query is for illustration only 

tôi cần để có thể thoát ra khỏi một cái gì đó như sau:

Property: CustomerID 
Operator: Equals 
Value: 1 

Property: CustomerName 
Operator: Equals 
Value: Bob 

Tôi đã viết một cái gì đó mà có thể kéo ra tên thuộc tính của một biểu thức, nhưng Tôi dường như không thể tìm ra nơi mà giá trị và toán tử được giữ, mặc dù nó khá rõ ràng trong thuộc tính DebugView của Expression.

Trả lời

8

Nhà điều hành sẽ có trên BinaryExpression 's Method là nút Equals. Bạn cũng nên nhìn vào các biểu thức .NodeType, cho thấy nhiều (nó phải là Equal).

Các giá trị thường sẽ được ở một ConstantExpression trong .Right của BinaryExpression đó, hoặc trong trường hợp của một biến chiếm được: các chụp bối cảnh sẽ là ConstantExpression, vì vậy giá trị sẽ là một MemberExpression trên ConstantExpression (bạn sẽ cần phải điều tra xem thành viên có phải là FieldInfoPropertyInfo và tìm nạp giá trị qua .GetValue(...) trên đó).

+0

Tuyệt vời, cảm ơn. Chỉ cần sử dụng 'predicate' bằng cách sử dụng biến vị ngữ' (BinaryExpression).Body' và bây giờ mọi thứ khá rõ ràng. Chúc mừng Marc. – GenericTypeTea

3

Ngoài câu trả lời của Marc Gravells (+1 ở đó), tôi sẽ bổ sung thêm rằng bạn nên xem qua lớp ExpressionVisitor (ngoài hộp trong .Net 4; MSDN có ví dụ mà bạn có thể sao chép/dán cho 3.5). Nó làm cho việc viết mã để trích xuất một số loại biểu thức rất rất dễ dàng.

Trong trường hợp của bạn, bạn sẽ tìm cách ghi đè phương thức VisitBinary của nó.

Tôi thường sử dụng lớp để đẩy (các) biểu thức tôi quan tâm vào danh sách chỉ đọc, ví dụ, sau đó tôi có sẵn công khai về việc triển khai lớp của tôi. Bạn không sử dụng nó để viết lại biểu thức.

+0

+1, cảm ơn. Nó chắc chắn làm cho nó dễ dàng hơn để tìm các biểu thức nhị phân, nhưng tôi sẽ để lại câu trả lời của Marc như được chấp nhận vì nó nói làm thế nào để kéo ra các thông tin tôi yêu cầu. – GenericTypeTea

+0

Có Tôi đồng ý - Câu trả lời của Marc cung cấp cho bạn các loại hạt và bu lông cho câu hỏi này và xứng đáng được đánh dấu; của tôi chỉ cung cấp một cách đơn giản để đạt được những gì anh ta đề xuất :) –

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