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
?