5

述語があります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...
}

よろしくお願いします。

4

1 に答える 1

7

式ツリーについて考える前に、通常のラムダで解決策を見つけてみてください。

述語があります

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);
}
于 2011-10-02T14:45:50.813 に答える