Bueno, simplemente, si tiene una clase de Entidad, y quiere usar expresiones lambda en esa Entidad para determinar si algo es válido (devolviendo booleano), podría usar un Func.
Por lo tanto, dado que la entidad:
class Entity
{
public string MyProperty { get; set; }
}
se podría definir una clase ReglaDeValidación para que de esta manera:
class ValidationRule<T> where T : Entity
{
private Func<T, bool> _rule;
public ValidationRule(Func<T, bool> rule)
{
_rule = rule;
}
public bool IsValid(T entity)
{
return _rule(entity);
}
}
entonces se podría utilizar de esta manera:
var myEntity = new Entity() { MyProperty = "Hello World" };
var rule = new ValidationRule<Entity>(entity => entity.MyProperty == "Hello World");
var valid = rule.IsValid(myEntity);
Por supuesto, esa es solo una posible solución.
Si elimina la restricción genérica anterior ("donde T: Entidad"), puede hacer que este sea un motor de reglas genéricas que podría usarse con cualquier POCO. No tendrías que derivar una clase para cada tipo de uso que necesites. Así que si quería utilizar esta misma clase en un cuadro de texto, podría usar el siguiente (después de la eliminación de la restricción genérica):
var rule = new ValidationRule<TextBox>(tb => tb.Text.Length > 0);
rule.IsValid(myTextBox);
es bastante flexible, de esta manera. Usar expresiones lambda y genéricos juntos es muy poderoso. En lugar de aceptar Func o Action, puede aceptar Expression> o Expression> y tener acceso directo al árbol express para investigar automáticamente cosas como el nombre de un método o propiedad, qué tipo de expresión es, etc. Y las personas que usan su la clase no tendría que cambiar una sola línea de código.
¿Puede ampliar el punto de herencia? –