2013-03-30 2 views
1
아래 코드는 StartsWithContains와 함께 작동

에 같음하지만 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 .... Expression에서 전문가가 아닌 어떻게이 작업을 수행 할 수 있습니까? –

답변

7

오류 메시지에 설명되어 있듯이 유형에 Equals(object)Equals(string) 형식으로 두 개 이상의 Equals 메서드가 정의되어 있습니다. 원하는 메서드를 찾기 위해 이름 만 사용하기 때문에 일치가 모호합니다.

하나의 솔루션은 방법의 MethodInfoExpression.Call으로 전달하는 것입니다.

MethodInfo equalsMethod = typeof(string).GetMethod("Equals", new[] { typeof(string) }); 
Expression.Call(instanceExpr, equalsMethod, Expression.Constant(value.ToString().ToUpper()));