2011-10-02 15 views
5

Ben muhtemelen Expression.Invoke ama couln kullanarak, birkaç yaklaşımlarla düşünmeye çalışıyordu T2 ait T1 özelliğini kullanarak bir yüklem Expression<Func<T2, bool>> olarak kullanmak gerekir bir yüklem Expression<Func<T1, bool>>Linq - İfade gelen İfade <T1> oluşturma <T2>

var; Başım ağrıyor. Başvuru için

:

class T2 { 
    public T1 T1; 
} 

Ve

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

Şimdiden teşekkürler çok.

cevap

7

İfade ağaçlarını düşünmeden önce çözümü normal lambdalarla bulmaya çalışın.

Sen şu şekilde bir ifade ağaç olarak bu inşa edebilirsiniz bir yüklem

Func<T1, bool> p1 

varsa ve bir yüklem

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

istiyorum:

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

Bu vali, sayesinde! – Variant