我正在尝试创建一个 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);
但是它们都不起作用。对于第一个,没有找到扩展方法。第二,它说
The type arguments for method 'ExtravagantExpressions.PredicateHelper.PrintExpression(System.Linq.Expressions.Expression>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
所以我尝试了以下方法,效果很好:
PredicateExtensions.PrintExpression<int>(p);
此外,这当然有效:
((Expression<Func<int, bool>>) p).PrintExpression();
但是是的...为什么其他人不起作用?我是不是误解了什么 implicit operator
有用吗?
最佳答案
这不是特定于扩展方法。 C# 不会将对象隐式转换为另一种类型,除非有关于目标类型的线索。假设如下:
class A {
public static implicit operator B(A obj) { ... }
public static implicit operator C(A obj) { ... }
}
class B {
public void Foo() { ... }
}
class C {
public void Foo() { ... }
}
您希望在以下语句中调用哪个方法?
new A().Foo(); // B.Foo? C.Foo?
关于C#:隐式运算符和扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685156/