using System.Collections.Generic;
public static void Main()
foreach( var item in SomeTypeRepository.Method(new Specification("salman", 1, 2)))
Console.WriteLine(item.Property2);
public interface ISpecification<T>
Func<T, bool> Predicate { get; }
public class Specification : ISpecification<SomeType>
public Specification(string filter1, int filter2, int filter3)
public Func<SomeType, bool> Predicate
Func<string, bool> contains = x => x.ToLower().Contains(_filter1);
Func<int, bool> between = x => _filter2 <= x && x <= _filter3;
Func<SomeType, bool> predicate = x => contains(x.Property2) && between(x.Property1);
public class SomeTypeRepository
private static readonly SomeType[] _items;
static SomeTypeRepository()
new SomeType { Property1 = 1, Property2 = "Husain" },
new SomeType { Property1 = 2, Property2 = "Salman" }
public static IEnumerable<SomeType> Method(ISpecification<SomeType> specification)
return _items.Where(specification.Predicate);
public int Property1 { get; set; }
public string Property2 { get; set; }