代码之家  ›  专栏  ›  技术社区  ›  SiberianGuy

谓词生成器方法说明

  •  2
  • SiberianGuy  · 技术社区  · 14 年前

    我查过了 PredicateBuilder 来源及其实现让我好奇。让我们看看或方法实现:

    public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                                          Expression<Func<T, bool>> expr2)
      {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
              (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
      }
    

    为什么它调用新的lambda而不是只对谓词体使用orelse?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Rafe    14 年前

    我认为这是一个打字问题: Expression.OrElse 返回纯表达式,而不是 Expression<Func<T, bool>>

        2
  •  0
  •   mdisibio    14 年前

    我也不是百分之百确定,但我认为问题在于确保每一个表达 Func<T,bool> 是一个参数,它是 T ,始终是每个表达式的相同实例。

    换句话说,用于:

    (t1 => t1>5).And(t2 => t2.Color == Blue)
    

    我们假定T1和T2在引用上是相等的,但是invocationExpression通过本质上说:“创建一个调用 ExPR2 参数来自 ExPR1 “。

    另请参见 PredicateBuilder Revisited 其中,作者,mono的贡献者,真正明确地检查参数的引用是否相等。