1234567891011121314151617181920212223242526272829303132333435363738394041 |
- using System;
- using System.Linq.Expressions;
- namespace VCommon.Linq.Expressions.Predicate.Internals
- {
- internal static class PredicateConcatUtility
- {
- public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
- {
- var secondBody = expr2.Body.Replace(expr2.Parameters[0], expr1.Parameters[0]);
- return Expression.Lambda<Func<T, bool>>(Expression.OrElse(expr1.Body, secondBody), expr1.Parameters);
- }
- public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
- {
- var secondBody = expr2.Body.Replace(expr2.Parameters[0], expr1.Parameters[0]);
- return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, secondBody), expr1.Parameters);
- }
- public static Expression Replace(this Expression expression, Expression searchEx, Expression replaceEx)
- {
- return new ReplaceVisitor(searchEx, replaceEx).Visit(expression);
- }
- private class ReplaceVisitor : ExpressionVisitor
- {
- private readonly Expression _from, _to;
- public ReplaceVisitor(Expression from, Expression to)
- {
- _from = from;
- _to = to;
- }
- public override Expression Visit(Expression node)
- {
- return node == _from ? _to : base.Visit(node);
- }
- }
- }
- }
|