Sto cercando di creare una classe PredicateBuilder<T>
che avvolge un Expression<Func<T, bool>>
e fornisce alcuni metodi per costruire facilmente fino un'espressione con vari And
e Or
metodi. Ho pensato che sarebbe stato bello poter usare direttamente questo PredicateBuilder<T>
come Expression<Func<T, bool>>
, e ho pensato che si potesse fare con un metodo implicit operator
.C#: operatore implicita e Metodi di estensione
ridotta versione della classe si presenta così:
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;
}
}
Poi, proprio come un test, ho questo metodo di estensione in una classe statica:
public static void PrintExpression<T>(this Expression<Func<T, bool>> expression)
{
Console.WriteLine(expression);
}
Nella mia testa, ho dovrebbe quindi essere in grado di fare questi:
var p = new PredicateBuilder<int>(true);
p.PrintExpression();
PredicateExtensions.PrintExpression(p);
Tuttavia nessuno di loro funziona. Per il primo, il metodo di estensione non è stato trovato. E per il secondo, si dice che
Il tipo di argomenti per il metodo 'ExtravagantExpressions.PredicateHelper.PrintExpression (System.Linq.Expressions.Expression>)' non possono essere dedotti dal loro utilizzo. Prova a specificare esplicitamente gli argomenti del tipo.
Così ho provato la seguente, che ha funzionato:
PredicateExtensions.PrintExpression<int>(p);
Inoltre, questo funziona, naturalmente:
((Expression<Func<int, bool>>) p).PrintExpression();
Ma sì ... perché non gli altri lavorano? Ho frainteso qualcosa su come funziona questa cosa implicit operator
?
Grazie per la pulizia! Continuo a scrivere extention invece di estensione ... Non so perché! Io solo ... non posso ... smettere ... = S – Svish