Expression解析问题

风隐若现 2016-12-25 12:42:21
int m = 10

Expression<Func<Student,bool>> la = (n=>n.id=m);


如何在解析表达是的时候取到m的值,我只能解析成 id=m 不能解析成id=10
大神帮帮忙

class Student
{
public int id{get;set;}
}
...全文
148 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
风隐若现 2016-12-26
  • 打赏
  • 举报
回复
引用 2 楼 Forty2 的回复:
n.id==m中的m,就是一个MemeberExpression。可以用反射,或运行编译表达式来求值。 比如(示例代码,没有错误处理):

// 方法一,运行编译表达式来求值。
object Eval(MemberExpression member)
{
    // cast对引用类型不是必须的,但返回值是结构就要cast。
    var cast = Expression.Convert(member, typeof(object));
    return Expression.Lambda<Func<object>>(cast).Compile().Invoke();
}

// 方法二,反射
private object Eval2(MemberExpression member)
{
    var obj = (member.Expression as ConstantExpression).Value;
    return (member.Member as FieldInfo).GetValue(obj);
}

// 测试
{
    int m = 10;
    Expression<Func<Student, bool>> la = (n =>  n.id == m );

    var body = la.Body as BinaryExpression;
    var right = Expression.Constant(Eval(body.Right as MemberExpression));
    var updatedExp = body.Update(body.Left, body.Conversion, right);
    var str = updatedExp.ToString(); // (n.id == 10)
}
厉害,厉害,多谢了 哈哈
Forty2 2016-12-25
  • 打赏
  • 举报
回复
n.id==m中的m,就是一个MemeberExpression。可以用反射,或运行编译表达式来求值。 比如(示例代码,没有错误处理):

// 方法一,运行编译表达式来求值。
object Eval(MemberExpression member)
{
    // cast对引用类型不是必须的,但返回值是结构就要cast。
    var cast = Expression.Convert(member, typeof(object));
    return Expression.Lambda<Func<object>>(cast).Compile().Invoke();
}

// 方法二,反射
private object Eval2(MemberExpression member)
{
    var obj = (member.Expression as ConstantExpression).Value;
    return (member.Member as FieldInfo).GetValue(obj);
}

// 测试
{
    int m = 10;
    Expression<Func<Student, bool>> la = (n =>  n.id == m );

    var body = la.Body as BinaryExpression;
    var right = Expression.Constant(Eval(body.Right as MemberExpression));
    var updatedExp = body.Update(body.Left, body.Conversion, right);
    var str = updatedExp.ToString(); // (n.id == 10)
}
风隐若现 2016-12-25
  • 打赏
  • 举报
回复
来人啊,顶顶顶

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧