2012-01-09 42 views
5

Đây là lần đầu tiên tôi thực sự xử lý cây biểu thức và tôi đã mất một chút. Tôi xin lỗi nếu câu hỏi này không có ý nghĩa gì cả. Hãy xem xét các loại sau đây:Thêm một nút/thuộc tính vào một cây biểu hiện

public class Foo<T> { 
    public T Value { get; set; } 
    public bool Update { get; set;} 
} 

public class Bar { 
    public Foo<bool> SomeBool { get; set; } 
    public Foo<string> SomeString { get; set; } 
} 

Vì vậy, ngay bây giờ tôi có một phương pháp helper trông như thế này:

public void Helper<T>(Expression<Func<Bar, Foo<T>>> baseExpression, Expression<Func<Bar, T>> valExpression, Expression<Func<Bar, bool>> updateExpression) 
{ 
    // Do some stuff with those expressions. 
} 

Và sau đó nó được gọi như thế này:

Helper(b=>b.SomeBool,b=>b.SomeBool.Value,b=>b.SomeBool.Update); 

Nhưng tôi không thích xây dựng ba biểu thức gần giống hệt nhau và phải chuyển rõ ràng chúng vào Trình trợ giúp. Những gì tôi muốn là một cái gì đó như thế này:

Helper(b=>b.SomeBool); 

Và sau đó:

public void Helper<T>(Expression<Func<Bar, Foo<T>>> baseExpression) 
{ 
    // Do some stuff 
    var valExpression = ???; // append `.Value` to baseExpression 
    var updateExpression = ???; // append `.Update` to baseExpression 
} 

Nhưng tôi không thực sự chắc chắn làm thế nào để làm điều đó ... boggling của tâm trí của tôi, bất kỳ xô trong hướng chính xác sẽ được đánh giá cao.

Trả lời

7

Chắc chắn; nếu bạn có baseExpression, thì một cái gì đó như:

var valExpression = Expression.Lambda<Func<Bar, T>>(
    Expression.PropertyOrField(baseExpression.Body, "Value"), 
    baseExpression.Parameters); 
var updateExpression = Expression.Lambda<Func<Bar, bool>>(
    Expression.PropertyOrField(baseExpression.Body, "Update"), 
    baseExpression.Parameters); 
Các vấn đề liên quan