C# 拼接 MethodCallExpression

  1. 现状: 有两个MethodCallExpression, 调用的都是一个参数为object, 返回值为空的方法
  2. 目的: 把他们合并为一个 MethodCallExpression
  3. 要求: 在新生成的 MethodCallExpression 中同时调用两个旧的 MethodCallExpression (或者两个旧的 MethodCallExpression 对应的方法)
  4. 可能的思路: 拼接两个 Expression
  5. 注意: 我没用过很复杂的 Expression 请不要回答得过于复杂, 谢谢你!

// 假设旧的 MethodCallExpression 存在于 oldMethodCallExpr1 和 oldMethodCallExpr2 变量中

// 创建用于合并的参数表达式
ParameterExpression param = Expression.Parameter(typeof(object));

// 创建新的 MethodCallExpression
Expression newMethodCallExpr = Expression.Block(
    oldMethodCallExpr1, // 调用第一个旧的 MethodCallExpression
    oldMethodCallExpr2  // 调用第二个旧的 MethodCallExpression
);

// 替换参数表达式
newMethodCallExpr = ExpressionHelper.ReplaceParameter(newMethodCallExpr, param);

// 定义一个辅助方法用于替换表达式中的参数
public static Expression ReplaceParameter(Expression expression, ParameterExpression parameter)
{
    return new ParameterReplacer(parameter).Visit(expression);
}

// 定义一个表达式访问器用于替换参数表达式
public class ParameterReplacer : ExpressionVisitor
{
    private readonly ParameterExpression _parameter;

    public ParameterReplacer(ParameterExpression parameter)
    {
        this._parameter = parameter;
    }

    protected override Expression VisitParameter(ParameterExpression node)
    {
        return this._parameter;
    }
}