将函数调用转换为表达式 C#

Convert a function call to a Expression C#

我有以下函数,我想在其中检查函数参数...

    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;
    }

问题是我不知道如何将函数调用转换成Expression,也就是说,我不知道如何进行下面的调用

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 重载,但在大多数情况下类型推断将不起作用。如果需要,您可以自行探索。