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