【发布时间】:2010-10-15 16:05:03
【问题描述】:
我正在尝试创建一个 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 的工作原理?
【问题讨论】:
标签: c# operator-overloading extension-methods