代码之家  ›  专栏  ›  技术社区  ›  RoboDev

用值展平表达式参数[重复]

  •  0
  • RoboDev  · 技术社区  · 6 年前

    public Expression<Func<T, string, bool>> FilterExp { get; set; }
    

    我需要用运行时已知的值替换字符串paramater,并转换为:

    Expression<Func<T, bool>>
    

    这就是我设置过滤器时的样子:

    PagingProvider<Employee> provider = new PagingProvider<Employee>(context.Employees);
    provider.FilterExp = (employee, filterText) => employee.FullName.Contains(filterText);
    return provider.GetResults();
    

    改变表达方式的最佳方式是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   RoboDev    6 年前

    我想到了这个,它似乎起了作用:

    protected class ParameterReplacer : ExpressionVisitor
    {
        private ParameterExpression parameterExpression;
        private string newValue;
    
        public ParameterReplacer(ParameterExpression parameterExpression, string newValue)
        {
            this.parameterExpression = parameterExpression;
            this.newValue = newValue;
        }
    
        public override Expression Visit(Expression node)
        {
            if (node == parameterExpression)
                return Expression.Constant(this.newValue);
    
            return base.Visit(node);
        }
    }
    

    在我的代码中,我是这样使用的:

    var replacer = new ParameterReplacer(FilterExp.Parameters[1], Filter);
    var newBody = replacer.Visit(FilterExp.Body);
    var exp = Expression.Lambda<Func<T, bool>>(newBody, FilterExp.Parameters[0]);
    return SourceData.Where(exp);