Combining two expressions (Expression>)

前端 未结 7 1707
无人共我
无人共我 2020-11-22 01:09

I have two expressions of type Expression> and I want to take to OR, AND or NOT of these and get a new expression of the same type

7条回答
  •  深忆病人
    2020-11-22 01:42

    Nothing new here but married this answer with this answer and slightly refactored it so that even I understand what's going on:

    public static class ExpressionExtensions
    {
        public static Expression> AndAlso(this Expression> expr1, Expression> expr2)
        {
            ParameterExpression parameter1 = expr1.Parameters[0];
            var visitor = new ReplaceParameterVisitor(expr2.Parameters[0], parameter1);
            var body2WithParam1 = visitor.Visit(expr2.Body);
            return Expression.Lambda>(Expression.AndAlso(expr1.Body, body2WithParam1), parameter1);
        }
    
        private class ReplaceParameterVisitor : ExpressionVisitor
        {
            private ParameterExpression _oldParameter;
            private ParameterExpression _newParameter;
    
            public ReplaceParameterVisitor(ParameterExpression oldParameter, ParameterExpression newParameter)
            {
                _oldParameter = oldParameter;
                _newParameter = newParameter;
            }
    
            protected override Expression VisitParameter(ParameterExpression node)
            {
                if (ReferenceEquals(node, _oldParameter))
                    return _newParameter;
    
                return base.VisitParameter(node);
            }
        }
    }
    

提交回复
热议问题