Linq - Создание выражения <T1> из выражения <T2> - PullRequest
5 голосов
/ 02 октября 2011

У меня есть предикат Expression<Func<T1, bool>>

Мне нужно использовать его в качестве предиката Expression<Func<T2, bool>> с использованием свойства T1 T2 Я пытался подумать о нескольких подходах, вероятно, используя Expression.Invoke но я не могу понять это.

Для справки:

class T2 {
  public T1 T1;
}

И

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

Большое спасибо заранее.

1 Ответ

7 голосов
/ 02 октября 2011

Попробуйте найти решение с помощью обычных лямбд, прежде чем думать о деревьях выражений.

У вас есть предикат

Func<T1, bool> p1

и вы хотите предикат

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

Вы можете построить это как дерево выражений следующим образом:

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);
}
...