下面的代码适用于StartsWith
和Contains
,但是当我尝试Equals
时,我遇到了以下异常:类型'System.String'上的多个方法'Equals'与提供的参数兼容。
要恢复,CreatePredicate可以构建3种类型的谓词,但只有Equals
不起作用:
AList.Where(x => x.MyField.StartsWith("ValueToSearch")); //OK
AList.Where(x => x.MyField.Contains("ValueToSearch")); //OK
AList.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;
}
答案 0 :(得分:7)
正如错误消息所述,Equals
类型 - Equals(object)
和Equals(string)
上定义了多个string
方法。由于您只使用名称来定位所需的方法,因此匹配不明确。
一种解决方案是将方法的MethodInfo
传递给Expression.Call
,例如
MethodInfo equalsMethod = typeof(string).GetMethod("Equals", new[] { typeof(string) });
Expression.Call(instanceExpr, equalsMethod, Expression.Constant(value.ToString().ToUpper()));