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

时间:2016-09-27 11:49:01

标签: c# .net-3.5 expression

我有以下功能,我想通过函数参数...

    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表达式的多个变体,但没有成功......

1 个答案:

答案 0 :(得分:2)

要使其与当前实现一起使用,您需要显式创建表达式并从中提取主体。代码将如下所示:

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重载,但在大多数情况下,类型推断将无法正常工作。如果需要,您可以自己探索。