2011-12-22 34 views
10

Tôi muốn biết làm thế nào để ràng buộc các tham số để các giá trị trong một cây biểutham số Binding trong cây biểu

Something như

Expression<Func<String, String, bool>> e1 = (x,y) => x == y; 

Sau đó, tôi muốn để ràng buộc y, trong khi vẫn giữ nó như là một đơn biểu hiện. Một nỗ lực rõ ràng sẽ là một cái gì đó như

Expresion<Func<String, bool>> e2 = x => e1(x, "Fixed Value Here"); 

Nhưng điều đó sẽ biến biểu thức của tôi thành nút Gọi. Có cách nào để chỉ đơn giản là ràng buộc một tham số trong biểu thức đầu tiên của tôi trong khi nhận được chữ ký của biểu thức thứ hai?

Trả lời

16
Expression<Func<String, String, bool>> e1 = (x,y) => x == y; 

var swap = new ExpressionSubstitute(e1.Parameters[1], 
    Expression.Constant("Fixed Value Here")); 
var lambda = Expression.Lambda<Func<string, bool>>(
    swap.Visit(e1.Body), e1.Parameters[0]); 

với

class ExpressionSubstitute : ExpressionVisitor 
{ 
    public readonly Expression from, to; 
    public ExpressionSubstitute(Expression from, Expression to) 
    { 
     this.from = from; 
     this.to = to; 
    } 
    public override Expression Visit(Expression node) 
    { 
     if (node == from) return to; 
     return base.Visit(node); 
    } 
} 

này sử dụng ExpressionVisitor để xây dựng lại biểu thức, thay y với hằng số.

Cách tiếp cận khác là sử dụng Expression.Invoke, nhưng điều này không hoạt động trong mọi trường hợp.

+0

Chính xác những gì tôi muốn. Như bạn đã nói, Invoke có thể là một công việc xung quanh, nhưng nó sẽ giống như một cuộc gọi cố định thay vì thay thế nhãn như bạn đã cung cấp. Cảm ơn. – Spooles

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