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

时间:2011-03-03 13:24:01

标签: c# .net expression-trees

我正在弄乱表达树,但我很少被卡住。

我有这个表达:

Expression<Func<IX, int>> expr = i => i.GetAll(1, b, method());

其中:

int b = 2;

public static int method()
{
    return 3;
}

public interface IX
{
    int GetAll(int a, int b, int c);
}

现在我想获得此方法的方法名称和参数值。方法的名称很简单,但参数值更难。我知道我可以自己解析它们,但我需要处理所有情况(ConstantExpressionMemberExpressionMethodCallExpression以及更多我不知道的情况。所以我在想是否有“一般”的方法来获得他们的价值观。例如1,2,3。

2 个答案:

答案 0 :(得分:8)

您可以获取相关MethodCallExpression的参数  并从中创建编译的Func<object>(如果需要,可以装箱值类型),然后可以对其进行评估。

E.g:

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

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

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

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

答案 1 :(得分:1)

你能不能只获取所有参数然后编译并执行它们?如果它们可以是方法调用,我不知道如何在不执行的情况下获取所有值。