| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Linq.Expressions;
 
- using System.Text;
 
- using System.Threading.Tasks;
 
- namespace  Common
 
- {
 
-     public static class LambdaExtension
 
-     {
 
-         public static Expression Property(this Expression expression, string propertyName)
 
-         {
 
-             return Expression.Property(expression, propertyName);
 
-         }
 
-         /// <summary>
 
-         /// 组合AndAlso
 
-         /// </summary>
 
-         /// <param name="left"></param>
 
-         /// <param name="right"></param>
 
-         /// <returns></returns>
 
-         public static Expression AndAlso(this Expression left, Expression right)
 
-         {
 
-             return Expression.AndAlso(left, right);
 
-         }
 
-         public static Expression Call(this Expression instance, string methodName, params Expression[] arguments)
 
-         {
 
-             return Expression.Call(instance, instance.Type.GetMethod(methodName) ?? throw new InvalidOperationException(), arguments);
 
-         }
 
-         public static Expression GreaterThan(this Expression left, Expression right)
 
-         {
 
-             return Expression.GreaterThan(left, right);
 
-         }
 
-         /// <summary>
 
-         /// 转成Lambda表达式
 
-         /// </summary>
 
-         /// <typeparam name="T"></typeparam>
 
-         /// <param name="body"></param>
 
-         /// <param name="parameters"></param>
 
-         /// <returns></returns>
 
-         public static Expression<T> ToLambda<T>(this Expression body, params ParameterExpression[] parameters)
 
-         {
 
-             return Expression.Lambda<T>(body, parameters);
 
-         }
 
-         /// <summary>
 
-         /// True
 
-         /// </summary>
 
-         /// <typeparam name="T"></typeparam>
 
-         /// <returns></returns>
 
-         public static Expression<Func<T, bool>> True<T>() { return param => true; }
 
-         /// <summary>
 
-         /// False
 
-         /// </summary>
 
-         /// <typeparam name="T"></typeparam>
 
-         /// <returns></returns>
 
-         public static Expression<Func<T, bool>> False<T>() { return param => false; }
 
-         /// <summary>
 
-         /// 组合And
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
 
-         {
 
-             return first.Compose(second, Expression.AndAlso);
 
-         }
 
-         /// <summary>
 
-         /// 组合Or
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
 
-         {
 
-             return first.Compose(second, Expression.OrElse);
 
-         }
 
-         /// <summary>
 
-         /// Combines the first expression with the second using the specified merge function.
 
-         /// </summary>
 
-         private static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
 
-         {
 
-             var map = first.Parameters
 
-                 .Select((f, i) => new { f, s = second.Parameters[i] })
 
-                 .ToDictionary(p => p.s, p => p.f);
 
-             var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
 
-             return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
 
-         }
 
-         /// <summary>
 
-         /// ParameterRebinder
 
-         /// </summary>
 
-         private class ParameterRebinder : ExpressionVisitor
 
-         {
 
-             /// <summary>
 
-             /// The ParameterExpression map
 
-             /// </summary>
 
-             private readonly Dictionary<ParameterExpression, ParameterExpression> _map;
 
-             /// <summary>
 
-             /// Initializes a new instance of the <see cref="ParameterRebinder"/> class.
 
-             /// </summary>
 
-             /// <param name="map">The map.</param>
 
-             private ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
 
-             {
 
-                 this._map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
 
-             }
 
-             /// <summary>
 
-             /// Replaces the parameters.
 
-             /// </summary>
 
-             /// <param name="map">The map.</param>
 
-             /// <param name="exp">The exp.</param>
 
-             /// <returns>Expression</returns>
 
-             public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
 
-             {
 
-                 return new ParameterRebinder(map).Visit(exp);
 
-             }
 
-             /// <summary>
 
-             /// Visits the parameter.
 
-             /// </summary>
 
-             /// <param name="p">The p.</param>
 
-             /// <returns>Expression</returns>
 
-             protected override Expression VisitParameter(ParameterExpression p)
 
-             {
 
-                 if (_map.TryGetValue(p, out ParameterExpression replacement))
 
-                 {
 
-                     p = replacement;
 
-                 }
 
-                 return base.VisitParameter(p);
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |