我想创建一个PredicateBuilder
它包装的类Expression
,并提供一些方法来轻松地建立了各种的表达And
和Or
方法.我认为这将是冷静,如果我可以用这PredicateBuilder
一个是Expression
直接,认为这可以由具有进行implicit operator
方法的事情.
这个类的精简版看起来像这样:
class PredicateBuilder{ public Expression > Predicate { get; protected set; } public PredicateBuilder(bool initialPredicate) { Predicate = initialPredicate ? (Expression >) (x => true) : x => false; } public static implicit operator Expression >( PredicateBuilder expressionBuilder) { return expressionBuilder.Predicate; } }
然后,就像测试一样,我在静态类中有这个扩展方法:
public static void PrintExpression(this Expression > expression) { Console.WriteLine(expression); }
在我的脑海中,我应该能够做到这些:
var p = new PredicateBuilder(true); p.PrintExpression(); PredicateExtensions.PrintExpression(p);
但是它们都不起作用.对于第一个,找不到扩展方法.而对于第二个,它说
无法从用法中推断出方法'ExtravagantExpressions.PredicateHelper.PrintExpression(System.Linq.Expressions.Expression>)'的类型参数.尝试显式指定类型参数.
所以我尝试了以下工作:
PredicateExtensions.PrintExpression(p);
此外,这当然有效:
((Expression>) 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?