gpt4 book ai didi

c# - 如何编译带有参数操作的 MethodCallExpression?

转载 作者:行者123 更新时间:2023-11-30 23:06:51 27 4
gpt4 key购买 nike

我有一个方法Method

private static int Method(int n)
{
return n;
}

我在我的 ExpressionVisitor 中覆盖了 VisitMethodCall 中的 MethodCallExpression。 MethodCallExpression 包含:

n => Method(2 + n)

我想将它编译成 Func 并像这样调用:

func(3)

它应该返回 5。

我试过这个:

    IEnumerable<ParameterExpression> parameters = expression.Arguments.Select(a => Expression.Parameter(a.Type, a.ToString()));
MethodCallExpression call = Expression.Call(expression.Method, parameters);
Expression<Func<Int32, Int32>> lambda = Expression.Lambda<Func<int, int>>(call, call.Arguments.OfType<ParameterExpression>());
var func = lambda.Compile();
Console.WriteLine(func(3));

它返回我 3,而不是 5

因为2+x是param name,我用3代替了。

最佳答案

不确定您为什么要这样做,但无论如何,您需要提取 MethodCallExpression 使用的参数(不是实参)。为此,您可以像这样滥用表达式访问者:

public class ParametersExtractorVisitor : ExpressionVisitor {
public IList<ParameterExpression> ExtractedParameters { get; } = new List<ParameterExpression>();
protected override Expression VisitParameter(ParameterExpression node) {
ExtractedParameters.Add(node);
return base.VisitParameter(node);
}
}

然后在你的代码中像这样使用它:

var visitor = new ParametersExtractorVisitor();
visitor.Visit(expression);
MethodCallExpression call = Expression.Call(expression.Method, expression.Arguments);
Expression<Func<Int32, Int32>> lambda = Expression.Lambda<Func<int, int>>(call, visitor.ExtractedParameters);
var func = lambda.Compile();
Console.WriteLine(func(3));

关于c# - 如何编译带有参数操作的 MethodCallExpression?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47831751/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com