using System; using System.Linq.Expressions; namespace JSMachine.WMS.Infrastructure.LambdaHelp { public static class ExpressionExtension { public static Expression> And(this Expression> expr1, Expression> expr2) { if (expr1 == null) return expr2; else if (expr2 == null) return expr1; //return Expression.Lambda>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters); ParameterExpression newParameter = Expression.Parameter(typeof(T), "c"); NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter); var left = visitor.Replace(expr1.Body); var right = visitor.Replace(expr2.Body); var body = Expression.And(left, right); return Expression.Lambda>(body, newParameter); } public static Expression> Or(this Expression> expr1, Expression> expr2) { if (expr1 == null) return expr2; else if (expr2 == null) return expr1; ParameterExpression newParameter = Expression.Parameter(typeof(T), "c"); NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter); var left = visitor.Replace(expr1.Body); var right = visitor.Replace(expr2.Body); var body = Expression.Or(left, right); return Expression.Lambda>(body, newParameter); } //与拼接 public static Expression> AndAlso(this Expression> a, Expression> b) { var p = Expression.Parameter(typeof(T), "p"); var bd = Expression.AndAlso( Expression.Invoke(a, p), Expression.Invoke(b, p)); var ld = Expression.Lambda>(bd, p); return ld; } //或拼接 public static Expression> Orelse(this Expression> a, Expression> b) { var p = Expression.Parameter(typeof(T), "p"); var bd = Expression.OrElse( Expression.Invoke(a, p), Expression.Invoke(b, p)); var ld = Expression.Lambda>(bd, p); return ld; } } internal class NewExpressionVisitor : ExpressionVisitor { public ParameterExpression _NewParameter { get; private set; } public NewExpressionVisitor(ParameterExpression param) { this._NewParameter = param; } public Expression Replace(Expression exp) { return this.Visit(exp); } protected override Expression VisitParameter(ParameterExpression node) { return this._NewParameter; } } }