我正在搞乱表达树,但我有点卡住了.
我有这个表达式:
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); }
现在我想获得该方法的方法名称和参数值.方法的名称很简单,但参数值更难.我知道我可以自己解析它们,但我需要处理所有情况(ConstantExpression,MemberExpression,MethodCallExpression以及我可能不知道的更多).所以我在想是否有“一般”的方法来获得他们的价值观.例如1,2,3.
解决方法
您可以获得有问题的MethodCallExpression的参数
并从中创建已编译的Func< object>(必要时装箱值类型),然后可以对其进行评估.
并从中创建已编译的Func< object>(必要时装箱值类型),然后可以对其进行评估.
例如.:
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()();