내부적으로 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.
감사합니다. 이제 "ex = {"모호한 일치가 발견되었습니다. "}"Expression.Call에서? GetMethod의 다른 오버로드를 사용할 수 있는지를 알 수 있지만이 방법이 올바른지 궁금해지기 시작했습니다. –
비슷한 방법으로 만들려고합니다. 나는 GetMethod ("Contains", 새로운 Type [] {typeof (string)})를 시도했다. 비록 이것이 문자열 클래스의 Contains 메서드를 사용하기는하지만. 이것은 모호한 일치 예외를 지나치지만 다른 예외로 실패합니다. –
GetMethod (string, Type []) overload를 사용하면 "Parameter is null"이되지 않습니다. 메소드 서명을 찾을 수 없기 때문일 수 있습니다. 이것은 "this"로 시작하는 Enumerable.Contains 확장 메소드 서명과 관련이있을 수 있습니다. –