Kri*_*s-I 2 .net c# expression c#-4.0
下面的代码适用于StartsWith,Contains但是当我尝试时,Equals我得到了这个异常:类型'System.String'上的多个方法'Equals'与提供的参数兼容.
要恢复,CreatePredicate可以构建3种类型的谓词,但只有Equals不起作用:
AList.Where(x => x.MyField.StartsWith("ValueToSearch")); //OKAList.Where(x => x.MyField.Contains("ValueToSearch")); //OKAList.Where(x => x.MyField.Equals("ValueToSearch")); //Not OK..
public enum TypeSearch
{
StartsWith = 1,
Contains = 2,
Equals = 3
}
private static Expression<Func<T, bool>> CreatePredicate<T>(string member, object value, TypeSearch type)
{
var p = System.Linq.Expressions.Expression.Parameter(typeof(T));
System.Linq.Expressions.Expression body = p;
foreach (var subMember in member.Split('.'))
{
body = System.Linq.Expressions.Expression.PropertyOrField(body, subMember);
}
var res = System.Linq.Expressions.Expression.Lambda<Func<T, bool>>(
System.Linq.Expressions.Expression.Call(
System.Linq.Expressions.Expression.Call(
body,
"ToUpper", null),
type.ToString(), null,
System.Linq.Expressions.Expression.Constant(value.ToString().ToUpper())
), p);
return res;
}
Run Code Online (Sandbox Code Playgroud)
正如错误消息所解释的那样,Equals在string类型上定义了多个方法- Equals(object)和Equals(string).由于您只使用名称来定位所需的方法,因此匹配不明确.
一种解决方案是MethodInfo将方法传递给Expression.Call例如
MethodInfo equalsMethod = typeof(string).GetMethod("Equals", new[] { typeof(string) });
Expression.Call(instanceExpr, equalsMethod, Expression.Constant(value.ToString().ToUpper()));
Run Code Online (Sandbox Code Playgroud)