我正在努力创造一个 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
事情有效吗?