创建自定义IEnumerable.Contains LINQ表达式

时间:2011-02-25 04:26:28

标签: linq

我需要创建一个自定义的“Contains”LINQ表达式,该表达式派生自System.Linq.Expressions.Expression,它在内部执行IEnumerable.Contains方法调用。该类将接受两个表达式参数。第一个计算IEnumerable类型的类型和实例,第二个计算类型为T的实例。

我需要将它作为自己的类,因为我想覆盖ToString方法以返回表示正在执行的操作的自定义字符串。

到目前为止,我有以下内容:

 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; }

    }

我在使用Expression.Call时遇到了麻烦。基本上,我想调用IEnumerable.Contains()。

任何指针总是受到赞赏。 TIA。

1 个答案:

答案 0 :(得分:2)

嗯,有一个问题是IEnumerable接口没有Contains方法。您可能正在寻找System.Linq.Enumerable中声明的扩展方法。

尝试(假设您有using System.Linq;指令):

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