2011-10-02 7 views
5

Tôi có một vị Expression<Func<T1, bool>>LINQ - Tạo biểu <T1> từ Biểu <T2>

tôi cần phải sử dụng nó như một vị Expression<Func<T2, bool>> sử dụng T1 tài sản của T2 Tôi đã cố gắng để suy nghĩ về nhiều approches, có lẽ sử dụng Expression.Invoke nhưng couln; Tôi ngẩng đầu lên.

Để tham khảo:

class T2 { 
    public T1 T1; 
} 

Expression<Func<T1, bool>> ConvertPredicates(Expression<Func<T2, bool>> predicate) { 
    //what to do here... 
} 

Thanks a lot trước.

Trả lời

7

Cố gắng tìm giải pháp với lambdas bình thường trước khi bạn nghĩ về cây biểu thức.

Bạn có một vị

Func<T1, bool> p1 

và muốn có một vị

Func<T2, bool> p2 = (x => p1(x.T1)); 

Bạn có thể xây dựng này như một cây biểu hiện như sau:

Expression<Func<T2, bool>> Convert(Expression<Func<T1, bool>> predicate) 
{ 
    var x = Expression.Parameter(typeof(T2), "x"); 
    return Expression.Lambda<Func<T2, bool>>(
     Expression.Invoke(predicate, Expression.PropertyOrField(x, "T1")), x); 
} 
+0

này là hoàn hảo, cảm ơn! – Variant