Я пытаюсь создать класс PredicateBuilder<T>
, который обертывает Expression<Func<T, bool>>
и предоставляет некоторые методы, позволяющие легко создать выражение с различными методами And
и Or
. Я подумал, что было бы здорово, если бы я мог использовать этот PredicateBuilder<T>
как Expression<Func<T, bool>>
напрямую, и подумал, что это может быть сделано с помощью метода метода implicit operator
.
Урезанная версия класса выглядит следующим образом:
class PredicateBuilder<T>
{
public Expression<Func<T, bool>> Predicate { get; protected set; }
public PredicateBuilder(bool initialPredicate)
{
Predicate = initialPredicate
? (Expression<Func<T, bool>>) (x => true)
: x => false;
}
public static implicit operator Expression<Func<T, bool>>(
PredicateBuilder<T> expressionBuilder)
{
return expressionBuilder.Predicate;
}
}
Затем, как и тест, у меня есть этот метод расширения в статическом классе:
public static void PrintExpression<T>(this Expression<Func<T, bool>> expression)
{
Console.WriteLine(expression);
}
В моей голове я должен был бы сделать это:
var p = new PredicateBuilder<int>(true);
p.PrintExpression();
PredicateExtensions.PrintExpression(p);
Однако никто из них не работает. Для первого метода расширения не найдено. А во-вторых, говорится, что
Аргументы типа для метода "ExtravagantExpressions.PredicateHelper.PrintExpression(System.Linq.Expressionions.Expression > )" не могут быть выведены из использования. Попробуйте явно указать аргументы типа.
Итак, я попробовал следующее:
PredicateExtensions.PrintExpression<int>(p);
Кроме того, это работает, конечно:
((Expression<Func<int, bool>>) p).PrintExpression();
Но да... почему другие не работают? Я что-то неправильно понял о том, как это работает implicit operator
?