2011-02-25 3 views
2

내부적으로 IEnumerable.Contains 메서드 호출을 수행하는 System.Linq.Expressions.Expression에서 파생 된 사용자 지정 "포함"LINQ 식을 만들어야합니다. 이 클래스는 두 개의 표현 매개 변수를 허용합니다. 첫 번째는 IEnumerable 형식의 인스턴스를 평가하고 두 번째는 T 형식의 인스턴스를 평가합니다.사용자 지정 IEnumerable 만들기 LINQ 식 포함

작업을 나타내는 사용자 지정 문자열을 반환하도록 ToString 메서드를 재정의하려면이 메서드를 자체 클래스로 사용해야합니다. 공연. Expression.Call와

public class ContainsExpression : Expression 
    { 
     public ContainsExpression(Expression left, Expression right) : 
      base(ExpressionType.Call, typeof(ContainsExpression)) 
     { 
      Left = left; 
      Right = right; 

      // Error here: value cannot be null 
      Expression.Call(
       typeof(IEnumerable).GetMethod("Contains", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public), left, right); 
     } 

     public static ContainsExpression Contains(Expression itemExpr, Expression collectionExpr) 
     { 
      return new ContainsExpression(itemExpr, collectionExpr); 
     } 

     public override string ToString() 
     { 
      return Left.ToString() + " Contains " + Right.ToString(); 
     } 


     public Expression Left { get; private set; } 
     public Expression Right { get; private set; } 

    } 

나는 데 문제 :

지금까지, 나는 다음 있습니다. 기본적으로 IEnumerable.Contains()를 호출하려고합니다.

모든 포인터는 항상 높이 평가됩니다. TIA.

답변

2

글쎄, 하나의 문제는 IEnumerable 인터페이스에 Contains 메소드가 없다는 것입니다. 아마 System.Linq.Enumerable에 선언 된 확장 메소드를 찾고있을 것입니다.

봅니다 (당신이 using System.Linq; 지침을 가정) : 응답

Expression.Call(typeof(Enumerable).GetMethod("Contains", ... 
+0

감사합니다. 이제 "ex = {"모호한 일치가 발견되었습니다. "}"Expression.Call에서? GetMethod의 다른 오버로드를 사용할 수 있는지를 알 수 있지만이 방법이 올바른지 궁금해지기 시작했습니다. –

+0

비슷한 방법으로 만들려고합니다. 나는 GetMethod ("Contains", 새로운 Type [] {typeof (string)})를 시도했다. 비록 이것이 문자열 클래스의 Contains 메서드를 사용하기는하지만. 이것은 모호한 일치 예외를 지나치지만 다른 예외로 실패합니다. –

+0

GetMethod (string, Type []) overload를 사용하면 "Parameter is null"이되지 않습니다. 메소드 서명을 찾을 수 없기 때문일 수 있습니다. 이것은 "this"로 시작하는 Enumerable.Contains 확장 메소드 서명과 관련이있을 수 있습니다. –