Я пытаюсь создать класс 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.Expressions.Expression>)' не могут быть выведены из использования. Попробуйте указать аргументы типа явно.
Итак, я попробовал следующее, которое сработало:
PredicateExtensions.PrintExpression<int>(p);
Кроме того, это работает, конечно:
((Expression<Func<int, bool>>) p).PrintExpression();
Но да ... почему другие не работают? Неужели я что-то не так понял о том, как работает implicit operator
?