获取表达式树中方法参数的值

Eup*_*ric 6 .net c# expression-trees

我正在搞乱表达树,但我有点卡住了.

我有这个表达式:

Expression<Func<IX, int>> expr = i => i.GetAll(1, b, method());
Run Code Online (Sandbox Code Playgroud)

地点:

int b = 2;

public static int method()
{
    return 3;
}

public interface IX
{
    int GetAll(int a, int b, int c);
}
Run Code Online (Sandbox Code Playgroud)

现在我想获得该方法的方法名称和参数值.方法的名称很简单,但参数值更难.我知道我可以分析他们自己,但我需要处理的所有案件(ConstantExpression,MemberExpression,MethodCallExpression也许更多的,我不知道).所以我在想是否有"一般"的方法来获得他们的价值观.例如1,2,3.

Ani*_*Ani 8

您可以获取有MethodCallExpression问题的参数并Func<object>从中创建已编译的s(必要时可以装箱值类型),然后可以对其进行评估.

例如:

var args = from arg in ((MethodCallExpression)expr.Body).Arguments
           let argAsObj = Expression.Convert(arg, typeof(object))
           select Expression.Lambda<Func<object>>(argAsObj, null)
                            .Compile()();
Run Code Online (Sandbox Code Playgroud)

如果表达式的body不是方法调用表达式,或者如果方法的任何参数都不能按原样求值(例如,如果它们依赖于表达式的参数),这显然会爆炸.

显然,如果您事先知道方法的参数类型,那么您可以做得更好.对于您的具体示例,这应该工作:

var args = from arg in ((MethodCallExpression)expr.Body).Arguments               
           select Expression.Lambda<Func<int>>(arg, null)
                            .Compile()();
Run Code Online (Sandbox Code Playgroud)