2013-03-30 3 views
1

ниже код работает с StartsWith и Contains, но когда я попытался Equals я получаю это исключение: Более один метод «Равно» на «System.String» типа совместим с указанными аргументами.Построить выражение Равно на строку

Чтобы возобновить, то 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

Что произойдет, если вы пройдете MethodInfo? –

+0

MethodeInfo .... как я могу это сделать, а не специалист в выражении. –

ответ

7

Как поясняется в сообщении об ошибке, существует более одного метода 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())); 
Смежные вопросы