我有以下功能,我想通过函数参数...
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表达式的多个变体,但没有成功......
答案 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
重载,但在大多数情况下,类型推断将无法正常工作。如果需要,您可以自己探索。