- 修复 LambadaExpressionExtensions 扩展方法 And/Or 当存在二级 lambada 时替换错误的 bug;

> 如:where.Add(a => a.Tags.Any(b => ...)),b 替换错误
This commit is contained in:
28810 2019-07-10 16:12:49 +08:00
parent 87c9ccf5c3
commit 42aa700b44

View File

@ -34,7 +34,7 @@ namespace System.Linq.Expressions
if (exp2 == null) return exp1;
ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter, exp2.Parameters.FirstOrDefault());
var left = visitor.Replace(exp1.Body);
var right = visitor.Replace(exp2.Body);
@ -62,7 +62,7 @@ namespace System.Linq.Expressions
if (exp2 == null) return exp1;
ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter, exp2.Parameters.FirstOrDefault());
var left = visitor.Replace(exp1.Body);
var right = visitor.Replace(exp2.Body);
@ -90,18 +90,16 @@ namespace System.Linq.Expressions
internal class NewExpressionVisitor : ExpressionVisitor
{
public ParameterExpression _newParameter { get; private set; }
public NewExpressionVisitor(ParameterExpression param)
ParameterExpression _newParameter;
ParameterExpression _oldParameter;
public NewExpressionVisitor(ParameterExpression newParam, ParameterExpression oldParam)
{
this._newParameter = param;
}
public Expression Replace(Expression exp)
{
return this.Visit(exp);
}
protected override Expression VisitParameter(ParameterExpression node)
{
return this._newParameter;
this._newParameter = newParam;
this._oldParameter = oldParam;
}
public Expression Replace(Expression exp) => this.Visit(exp);
protected override Expression VisitParameter(ParameterExpression node) =>
node == _oldParameter ? this._newParameter : node;
}
}