我正在尝试创建一个PredicateBuilder<T>
包装 an并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
件事的工作原理?