动态拼接Lambda表达式-表达式目录树动态构建及修改

访问 :表达式树 Expression<Func<int, int, int>> predicate1 = (m, n) => m * n + 2;
修改:  (m, n) => m * n + 2;改成(m, n) => m * n - 2;

/// <summary>
/// 访问 表达式树 Expression<Func<int, int, int>> predicate1 = (m, n) => m * n + 2;
/// (m, n) => m * n + 2;改成(m, n) => m * n - 2;
/// </summary>
public class OperatorExpressionVisitor : ExpressionVisitor
{
/// <summary>
/// 修改表达式树的形式
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
public Expression Modify(Expression expression)
{
//base.Visit(expression);
if (expression is BinaryExpression binary)
{
if (binary.NodeType == ExpressionType.Add)
{
var left = base.Visit(binary.Left); ;
var right = base.Visit( binary.Right);
var result = Expression.Subtract(left, right);
return result;
}
}
return expression;
}

/// <summary>
/// 表达式树的二元操作
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
protected override Expression VisitBinary(BinaryExpression node)
{
return base.VisitBinary(node);
}

/// <summary>
/// 表达式树的常量操作
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
protected override Expression VisitConstant(ConstantExpression node)
{
return base.VisitConstant(node);
}
}

/// <summary>
/// 测试表达式树的访问过程
/// </summary>
public static void TestDynamicExpressionVisitor()
{
Expression<Func<int, int, int>> predicate = (m, n) => m * n + 2;
//修改之前
var func1 = predicate.Compile();
var result1 = func1.Invoke(2, 3);
Console.WriteLine($"参数2,3");
Console.WriteLine($"修改---前");
Console.WriteLine($"body:{predicate.Body}");
Console.WriteLine($"结果:{result1}");
OperatorExpressionVisitor visitor = new OperatorExpressionVisitor();
var expression = visitor.Modify(predicate.Body);
Expression<Func<int, int, int>> lam = Expression.Lambda<Func<int, int, int>>(expression, predicate.Parameters);
var func = lam.Compile();
var result = func.Invoke(2, 3);
Console.WriteLine($"修改---后");
Console.WriteLine($"body:{lam.Body}");
Console.WriteLine($"结果:{result}");
}

 

龙腾一族至尊龙骑