Expression.Lambda 指定子类型的ParameterExpression
Expression.Lambda specify ParameterExpression of sub type
我想用OrElse加入一些表达式,这个:
Expression<Func<Customer, bool>> extraWhere = x => x.ExtraFields.Any(a => a.Value.Contains(filterText));
使用此代码:
var buildWhereColumns = BuildWhereColumns<Customer>(columns, filterText);
var combined = Expression.OrElse(buildWhereColumns.Body, extraWhere.Body);
var paramX = Expression.Parameter(typeof(Customer), "x");
var replacerX = new ParameterReplacer(paramX);
var newcombined = replacerX.Visit(combined);
var lambda = Expression.Lambda<Func<Customer, bool>>(newcombined, paramX);
我在 replacerX.Visit 上收到 ArgumentException,因为它将 Any 中的 'a' 视为客户。如何指定 a 的(ParameterExpression?)类型?
ParameterReplacer:
class ParameterReplacer : ExpressionVisitor
{
private readonly ParameterExpression parameter;
internal ParameterReplacer(ParameterExpression parameter)
{
this.parameter = parameter;
}
protected override Expression VisitParameter
(ParameterExpression node)
{
return parameter;
}
}
感谢 Titian Cernicova-Dragomir 的评论,我通过修复参数替换器解决了它。我添加了一个额外的 ParameterExpression:
var paramX = Expression.Parameter(typeof(Customer), "x");
var paramA = Expression.Parameter(typeof(ExtraFields), "a");
var replacerX = new ParameterReplacer(paramX, paramA);
var newcombined = replacerX.Visit(combined);
和参数替换器
class ParameterReplacer : ExpressionVisitor
{
private readonly ParameterExpression[] parameter;
internal ParameterReplacer(params ParameterExpression[] parameter)
{
this.parameter = parameter;
}
protected override Expression VisitParameter
(ParameterExpression node)
{
return parameter.Single(x => x.Type == node.Type);
}
}
我想用OrElse加入一些表达式,这个:
Expression<Func<Customer, bool>> extraWhere = x => x.ExtraFields.Any(a => a.Value.Contains(filterText));
使用此代码:
var buildWhereColumns = BuildWhereColumns<Customer>(columns, filterText);
var combined = Expression.OrElse(buildWhereColumns.Body, extraWhere.Body);
var paramX = Expression.Parameter(typeof(Customer), "x");
var replacerX = new ParameterReplacer(paramX);
var newcombined = replacerX.Visit(combined);
var lambda = Expression.Lambda<Func<Customer, bool>>(newcombined, paramX);
我在 replacerX.Visit 上收到 ArgumentException,因为它将 Any 中的 'a' 视为客户。如何指定 a 的(ParameterExpression?)类型?
ParameterReplacer:
class ParameterReplacer : ExpressionVisitor
{
private readonly ParameterExpression parameter;
internal ParameterReplacer(ParameterExpression parameter)
{
this.parameter = parameter;
}
protected override Expression VisitParameter
(ParameterExpression node)
{
return parameter;
}
}
感谢 Titian Cernicova-Dragomir 的评论,我通过修复参数替换器解决了它。我添加了一个额外的 ParameterExpression:
var paramX = Expression.Parameter(typeof(Customer), "x");
var paramA = Expression.Parameter(typeof(ExtraFields), "a");
var replacerX = new ParameterReplacer(paramX, paramA);
var newcombined = replacerX.Visit(combined);
和参数替换器
class ParameterReplacer : ExpressionVisitor
{
private readonly ParameterExpression[] parameter;
internal ParameterReplacer(params ParameterExpression[] parameter)
{
this.parameter = parameter;
}
protected override Expression VisitParameter
(ParameterExpression node)
{
return parameter.Single(x => x.Type == node.Type);
}
}