当程序调用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;
}
这确实有点绕,解释如下:你报错的那句Expression.Call重载为
public static MethodCallExpression Call(Expression instance, MethodInfo method, params Expression[] arguments)
最后一个参数叫arguments,它是本次构建函数调用表达式(MethodCallExpression)的参数表达式列表。HandleLike的参数类型是MethodCallExpression, 参数的值是m,但是你构建arguments的时候并不是要用它的值,而是要用一个表达式。所以把m改成Expression.Constant(m) 即可。
高手啊。膜拜。
请问方便留下QQ号?我的422950555 好以后向你请教问题。
建议你把 你要怎么调用的方法给贴出来。
这个是表达式树吧,当然我不是很熟悉,我觉得你的
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类型。
}