将函数调用转换为表达式
本文关键字:表达式 转换 函数调用 | 更新日期: 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
过载,但在大多数情况下,类型推断不起作用。如果你愿意,你可以自己去探索。