Linq.Expressions扩展ExpressionExtension

手上有一个以前项目用到的.NET工具类封装的DLL。
正好又想试一下动态LAMBDA表达式,用.NET Reflector看一下源码。

    public static class ExpressionExtension
    {  
        public static Expression<Func<TSource, bool>> And<TSource>(this Expression<Func<TSource, bool>> a, Expression<Func<TSource, bool>> b)
        {
            ParameterExpression replaceWith = Expression.Parameter(typeof(TSource), "root");
            return Expression.Lambda<Func<TSource, bool>>(Expression.And(ParameterExpressionReplacer.Replace(a.Body, replaceWith), ParameterExpressionReplacer.Replace(b.Body, replaceWith)), new ParameterExpression[] { replaceWith });
        }
    
    }

    public class ParameterExpressionReplacer : ExpressionVisitor
    {
        // Fields
        private ParameterExpression replaceWith;
        private ParameterExpressionReplacer(ParameterExpression replaceWith)
        {
            this.replaceWith = replaceWith;
        }

        // Methods
        public static Expression Replace(Expression expression, ParameterExpression replaceWith) =>
            new ParameterExpressionReplacer(replaceWith).Visit(expression);

        protected override Expression VisitParameter(ParameterExpression node) =>
            replaceWith;

    }
posted @ 2021-01-18 11:28  sorachannel  阅读(122)  评论(0)    收藏  举报