首页 新闻 赞助 找找看

Lambda表达示高手在哪里? 请花点时间看一下错在哪里了。应该怎么弄啊。郁闷了好几天了。

0
悬赏园豆:100 [已解决问题] 解决于 2013-04-17 14:34

 当程序调用VisitMethodCall()这个方法时报错。m参数为:a.AliasName.Like("s")  时报的错为:

类型为“System.Boolean”的表达式不能用于方法“System.Linq.Expressions.Expression HandleLike(System.Linq.Expressions.MethodCallExpression)”的类型为“System.Linq.Expressions.MethodCallExpression”的参数

 

具体方法如下:

protected override Expression VisitMethodCall(MethodCallExpression m)
    {
        MethodInfo method = typeof(ExpressionParser).GetMethod("HandleLike");
        if (method != null)
        {
            MethodCallExpression methordCall = Expression.Call(Expression.Constant(this), method, m );
            LambdaExpression expression3 = Expression.Lambda<Func<Expression>>(methordCall, new ParameterExpression[0]);
            Func<Expression> func = (Func<Expression>)expression3.Compile();
            return func();
        }
        return base.VisitMethodCall(m);

 


    }

      public virtual Expression HandleLike(MethodCallExpression m)
    {
        this._ResultSql.Append("(");
        this.Visit(m.Arguments[0]);
        this._ResultSql.Append(" Like ");
        this.Visit(m.Arguments[1]);
        this._ResultSql.Append(")");
        return m;
    }

fobmqj的主页 fobmqj | 初学一级 | 园豆:64
提问于:2013-04-16 14:28
< >
分享
最佳答案
0

这确实有点绕,解释如下:你报错的那句Expression.Call重载为

public static MethodCallExpression Call(Expression instance, MethodInfo method, params Expression[] arguments)

最后一个参数叫arguments,它是本次构建函数调用表达式(MethodCallExpression)的参数表达式列表。HandleLike的参数类型是MethodCallExpression, 参数的值是m,但是你构建arguments的时候并不是要用它的值,而是要用一个表达式。所以把m改成Expression.Constant(m) 即可。

收获园豆:95
水牛刀刀 | 大侠五级 |园豆:6350 | 2013-04-17 10:38

高手啊。膜拜。

fobmqj | 园豆:64 (初学一级) | 2013-04-17 14:29

请问方便留下QQ号?我的422950555 好以后向你请教问题。

fobmqj | 园豆:64 (初学一级) | 2013-04-17 14:32
其他回答(2)
0

建议你把 你要怎么调用的方法给贴出来。

收获园豆:2
jingjunfeng | 园豆:873 (小虾三级) | 2013-04-16 18:05
0

这个是表达式树吧,当然我不是很熟悉,我觉得你的  

public virtual Expression HandleLike(MethodCallExpression m)
    {
        this._ResultSql.Append("(");
        this.Visit(m.Arguments[0]);
        this._ResultSql.Append(" Like ");
        this.Visit(m.Arguments[1]);
        this._ResultSql.Append(")");
        return m;==============》这个返回的是不是是个bool值??而你的这个方法接受的是一个Expression类型。
    }

收获园豆:3
K战神 | 园豆:93 (初学一级) | 2013-04-16 19:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册