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

c# – 从ExpressionTrees获取值

发布时间:2020-12-15 18:18:56 所属栏目:百科 来源:网络整理
导读:让那里: ExpressionFuncCustomer,bool expression = c = c.Name == "John"; 现在我通过使用获得价值: string myvalue = ((ConstantExpression) bin.Right).Value; 现在让它: string x = "John";ExpressionFuncCustomer,bool expression = c = c.Name == x
让那里:
Expression<Func<Customer,bool>> expression = c => c.Name == "John";

现在我通过使用获得价值:

string myvalue = ((ConstantExpression) bin.Right).Value;

现在让它:

string x = "John";
Expression<Func<Customer,bool>> expression = c => c.Name == x;

现在我明白了

string myvalue = ((ConstantExpression) bin.Right).Value;

会产生一个错误,因为这里的bin.right不是constantexpression它是一个字段表达式,但问题是如何从中得到值(John)?

解决方法

您可以将表达式包装在lambda中,然后对其进行编译和计算.无论表达式是什么,这都会给你带来价值.
string myvalue = Expression.Lambda<Func<string>>(bin.Right).Compile().Invoke();

请注意,如果在表达式的右侧使用参数c,则这将不起作用,因为它不会被定义.另请注意,当您调用Invoke时,这将为您提供右侧的当前值,如果对象中的字段发生更改,则后续调用可能会返回不同的值.

更新:如果您在编译时不知道右侧的类型,则可以使用object,但这会对int类等值类型中断.在返回之前,您需要使用Expression.Convert强制将值类型装箱.这适用于值类型和引用类型:

object myvalue = Expression.Lambda<Func<object>>(
    Expression.Convert(bin.Right,typeof(object))).Compile().Invoke();

您还可以使用无类型的lambda和DynamicInvoke:

object myvalue = Expression.Lambda(bin.Right).Compile().DynamicInvoke();

(编辑:李大同)

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

    推荐文章
      热点阅读