求高手一个问题!关于Expression>的问题

老许要老婆么 2013-11-20 09:10:38
 public class HomeController : Controller
{
//
// GET: /Home/

public ActionResult Index()
{
int age = 12;
//第一种写法
Say(c=>c.age==12)
//第二种写法
// Say(c=>c.age==age);

return View();
}
public void Say(Expression<Func<Person,bool>> where)
{
//这里取值
string hello = where.Body.ToString();
}

public ActionResult Login()
{
return View();
}


}

public class Person
{
public string Name { set; get; }
public int age { set; get; }
public string Gender { set; get; }
}


这个是这个代码。
使用第一种写法的时候取出的值是正常的c=>c.age==12

但是第二种使用变量传进去值得时候取出来的就出错了!


其中age是从前台传过来的,这个必须得放在一个变量里,其他地方也可以使用。

/*求大神赐教!100分如果不够可以追加*/
...全文
890 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Teln_小凯 2013-11-20
  • 打赏
  • 举报
回复
这个是自定义的 扩展方法 传委托参数的方法? 建议先去度娘下 扩展方法 委托参数,后面就好处理了
老许要老婆么 2013-11-20
  • 打赏
  • 举报
回复
引用 1 楼 huwei001982 的回复:
你为什么认为第二个是错的呢?
Sorry 我没说明白! 我需要把这个c=>c.age==age 在DAL层转成 正常的sql语句 where age=12
huwei001982 2013-11-20
  • 打赏
  • 举报
回复
你为什么认为第二个是错的呢?
老许要老婆么 2013-11-20
  • 打赏
  • 举报
回复
引用 5 楼 gomoku 的回复:
可以用ExpressionVisitor来修改表达式。比如下面的例子在MemberExpression可以求值的时候,把它简化为ConstantExpression。

public void Say(Expression<Func<Form1, bool>> where)
{
    //这里取值
    //string hello = where.Body.ToString();

    var exp = new MyExpressionVisitor().Visit(where) as LambdaExpression;
    string hello = exp.Body.ToString();  // (c.age==12)
}

class MyExpressionVisitor : ExpressionVisitor
{
    protected override Expression VisitMember(MemberExpression node)
    {
        if (node.Expression is ConstantExpression)
        {
            object obj = (node.Expression as ConstantExpression).Value;
            if (node.Member is FieldInfo)
            {
                var value = (node.Member as FieldInfo).GetValue(obj);
                return Expression.Constant(value, node.Type);
            }
            else if (node.Member is PropertyInfo)
            {
                var value = (node.Member as PropertyInfo).GetValue(obj);
                return Expression.Constant(value, node.Type);
            }
        }
        return base.VisitMember(node);
    }
}
非常感谢 !
wyufen 2013-11-20
  • 打赏
  • 举报
回复
http://www.cnblogs.com/hanyinglong/archive/2012/05/16/2505431.html 学习这个吧
gomoku 2013-11-20
  • 打赏
  • 举报
回复
可以用ExpressionVisitor来修改表达式。比如下面的例子在MemberExpression可以求值的时候,把它简化为ConstantExpression。

public void Say(Expression<Func<Form1, bool>> where)
{
    //这里取值
    //string hello = where.Body.ToString();

    var exp = new MyExpressionVisitor().Visit(where) as LambdaExpression;
    string hello = exp.Body.ToString();  // (c.age==12)
}

class MyExpressionVisitor : ExpressionVisitor
{
    protected override Expression VisitMember(MemberExpression node)
    {
        if (node.Expression is ConstantExpression)
        {
            object obj = (node.Expression as ConstantExpression).Value;
            if (node.Member is FieldInfo)
            {
                var value = (node.Member as FieldInfo).GetValue(obj);
                return Expression.Constant(value, node.Type);
            }
            else if (node.Member is PropertyInfo)
            {
                var value = (node.Member as PropertyInfo).GetValue(obj);
                return Expression.Constant(value, node.Type);
            }
        }
        return base.VisitMember(node);
    }
}

110,526

社区成员

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

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

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