using System.Collections.Generic;
using System.Linq.Expressions;
public static void Main()
var service = new UserService();
Console.WriteLine("Found {0} users online", service.Find((e, v) => e.Online == v, true).Count());
Console.WriteLine("Found {0} users offline", service.Find((e, v) => e.Online == v, false).Count());
Console.WriteLine("Found bates when count is 1: {0}", service.Find((e, v) => e.Name == v, "Bates").Count());
Console.WriteLine("PropertyName: {0}", service.GetName(e => e.Name));
Console.WriteLine("PropertyName: {0}", service.GetName(e => e.Online));
public abstract class ServiceBase<T>
public abstract IEnumerable<T> Find<TValue>(Func<T, TValue, bool> predicate, TValue val);
public string GetName<TType>(Expression<Func<T, TType>> exp)
var expression = (MemberExpression)exp.Body;
return expression.Member.Name;
public class UserService : ServiceBase<User>
public override IEnumerable<User> Find<TValue>(Func<User, TValue, bool> predicate, TValue val)
return Enumerable.Range(0, 10).Select(e => new User { Online = e % 2 == 0, Name = e == 1 ? "Bates" : string.Empty }).Where(e => predicate(e, val));
public bool Online { get; set; }
public string Name { get; set; }