using System.Collections.Generic;
using System.Linq.Expressions;
public interface IFilter<T>{
Expression<Func<T, bool>> Espressione { get; }
public int IdCliente {get;set;}
public string Nome {get;set;}
public bool ClienteVip {get;set;}
public static IEnumerable<Cliente> RicercaClienti(IFilter<Cliente> filtro){
var repo = new RepositoryClienti();
return repo.GetMany(filtro.Espressione);
public class RepositoryClienti {
public IEnumerable<Cliente> GetMany(Expression<Func<Cliente, bool>> where){
new Cliente { IdCliente = 1, Nome = "Mario Rossi", ClienteVip = false },
new Cliente { IdCliente = 2, Nome = "Luigi Verdi", ClienteVip = true },
new Cliente { IdCliente = 3, Nome = "Enzo Neri", ClienteVip = false },
return clienti.Where(where);
public class FiltroClienti : IFilter<Cliente> {
private readonly Expression<Func<Cliente, bool>> espressioneFiltro;
public FiltroClienti(Expression<Func<Cliente, bool>> espressioneFiltro){
this.espressioneFiltro = espressioneFiltro;
public Expression<Func<Cliente, bool>> Espressione { get { return espressioneFiltro; } }
public static void Main()
Expression<Func<Cliente, bool>> espressioneFiltro = cliente => cliente.ClienteVip == true;
var filtro = new FiltroClienti(espressioneFiltro);
var clientiFiltrati = RicercaClienti(filtro);
foreach (var cliente in clientiFiltrati){
Console.WriteLine(cliente.Nome);