将函数调用转换为表达式

本文关键字:表达式 转换 函数调用 | 更新日期: 2023-09-27 18:08:58

我有以下函数,我想在其中遍历函数参数…

    private static void TestExpression(Expression expr)
    {            
        MethodCallExpression methodCall = expr as MethodCallExpression;
        if(methodCall == null)
            throw new ArgumentException("not a function call");
        ReadOnlyCollection<Expression> args = methodCall.Arguments;
        ParameterInfo[] param = methodCall.Method.GetParameters();
        param.ToList().ForEach(p => Console.WriteLine(p.Name));
    }

只是为了举例说明,我也有一个虚拟函数…

    static int SomeFunc(int a, int b)
    {
        return 0;
    }
问题是我不知道如何将函数调用转换为表达式,也就是说,我不知道如何进行以下调用
TestExpression(/*Something here converting SomeFunc(20, 30) to a Expression*/)

我想说的是,我对遍历参数的其他方法不感兴趣。我尝试了多种变体与lambda表达式,但没有成功…

将函数调用转换为表达式

要使它与当前的实现一起工作,您需要显式地创建一个表达式并从中提取一个主体。代码是这样的:

TestExpression(((Expression<Func<int>>)(() => SomeFunc(1, 2))).Body);

但是不太好读

编辑:需要更多的信息,比如一个特定的用例,来尝试修改代码以提高可读性。

编辑:为了提高可读性,您可以使用这样的代码:

private static void TestExpression<T>(Expression<Func<T>> expr)
{
    TestExpression(expr.Body);
}

你可以这样调用这个方法:

TestExpression(() => SomeFunc(1, 2));

当然,您仍然需要为参数提供默认值。为了克服这个问题,您需要稍微更改TestExpression过载,但在大多数情况下,类型推断不起作用。如果你愿意,你可以自己去探索。