Estoy tratando de crear una clase PredicateBuilder<T>
que envuelve un Expression<Func<T, bool>>
y proporciona algunos métodos para crear fácilmente una expresión con varios métodos And
y Or
. Pensé que sería genial si pudiera usar este PredicateBuilder<T>
como un Expression<Func<T, bool>>
directamente, y pensé que esto podría hacerse teniendo una cosa de método implicit operator
.C#: operador implícito y métodos de extensión
simplificada versión de la clase tiene el siguiente aspecto:
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;
}
}
Entonces, como una prueba, tengo este método de extensión en una clase estática:
public static void PrintExpression<T>(this Expression<Func<T, bool>> expression)
{
Console.WriteLine(expression);
}
En mi cabeza, a continuación, debería ser capaz de hacer esto:
var p = new PredicateBuilder<int>(true);
p.PrintExpression();
PredicateExtensions.PrintExpression(p);
Sin embargo ninguno de ellos funciona. Para el primero, el método de extensión no se encuentra. Y para el segundo, se dice que
El tipo de argumentos para el método 'ExtravagantExpressions.PredicateHelper.PrintExpression (System.Linq.Expressions.Expression>)' no se pueden deducir a partir del uso. Intente especificar los argumentos de tipo explícitamente.
así que he intentado lo siguiente, que trabajó:
PredicateExtensions.PrintExpression<int>(p);
Además, esto funciona, por supuesto:
((Expression<Func<int, bool>>) p).PrintExpression();
Pero sí ... ¿por qué no los otros trabajan? ¿He entendido mal acerca de cómo funciona esta cosa implicit operator
?
Gracias por la limpieza! Sigo escribiendo extensión en lugar de extensión ... ¡No sé por qué! Yo solo ... no puedo ... parar ... = S – Svish