Expression<Func<T, bool>>
をラップするPredicateBuilder<T>
クラスを作成しようとしていて、様々なAnd
とOr
メソッドを持つ式を簡単に構築する方法をいくつか提供しています。このPredicateBuilder<T>
をExpression<Func<T, bool>>
と直接使うことができれば涼しいと思っていましたが、これはimplicit operator
メソッドのものを使って行うことができます。C#:暗黙の演算子と拡張メソッド
クラスのバージョンのようになりますダウン剥奪:私は、私の頭では
public static void PrintExpression<T>(this Expression<Func<T, bool>> expression)
{
Console.WriteLine(expression);
}
:単なるテストとして、私は静的クラスで、この拡張子の方法を持っている、そして、
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;
}
}
をこれらを行うことができるはずです:
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
の仕組みについて何か誤解しましたか?
クリーンアップありがとう!私は延長の代わりにエクステンションを書いています...なぜか分かりません!私はちょっと...止められない... = S – Svish