public static class Spec
{
/// <summary>
/// True条件。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns>True条件</returns>
public static Expression<Func<T, bool>> True<T>() { return f => true; }
/// <summary>
/// False条件。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns>False条件</returns>
public static Expression<Func<T, bool>> False<T>() { return f => false; }
/// <summary>
/// 逻辑或。
/// </summary>
/// <param name="left">左逻辑。</param>
/// <param name="right">右逻辑。</param>
/// <returns>逻辑表达式。</returns>
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
{
var invokedExpr = Expression.Invoke(right, left.Parameters);
return Expression.Lambda<Func<T, bool>>(Expression.Or(left.Body, invokedExpr), left.Parameters);
}
/// <summary>
/// 逻辑与。
/// </summary>
/// <param name="left">左逻辑。</param>
/// <param name="right">右逻辑。</param>
/// <returns>逻辑表达式。</returns>
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
{
var invokedExpr = Expression.Invoke(right, left.Parameters);
return Expression.Lambda<Func<T, bool>>(Expression.And(left.Body, invokedExpr), left.Parameters);
}
}