加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:38:10 所属栏目:百科 来源:网络整理
导读:我正在搞乱表达树,但我有点卡住了. 我有这个表达式: ExpressionFuncIX,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);} 现在我想获得该方法的方法
我正在搞乱表达树,但我有点卡住了.

我有这个表达式:

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>(必要时装箱值类型),然后可以对其进行评估.

例如.:

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()();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读