将函数调用转换为表达式 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
重载,但在大多数情况下类型推断将不起作用。如果需要,您可以自行探索。
我有以下函数,我想在其中检查函数参数...
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
重载,但在大多数情况下类型推断将不起作用。如果需要,您可以自行探索。