using System.Collections.Generic;
using System.Linq.Expressions;
var filters = new List<ExpressionFilter>{new ExpressionFilter{PropertyName = "CountryOfOrigin", Comparison = Comparison.Contains, Value = "Fr"}, };
var car = new Car{CountryOfOrigin = "France", };
var expressionTree = Test<Car>(filters[0]);
Func<Car, bool> anonymousFunc = expressionTree.Compile();
anonymousFunc(car).Should().BeTrue();
Console.WriteLine("Passed");
static Expression<Func<T, bool>> Test<T>(ExpressionFilter filter)
ParameterExpression param = Expression.Parameter(typeof (T), "t");
var exp = ExpressionRetriever.GetExpression<T>(param, filter);
return Expression.Lambda<Func<T, bool>>(exp, param);
public string CountryOfOrigin
public string CountryOfProduction
public int MaxMilesPerHour
public int MilesPerGallon
public static class ExpressionRetriever
private static MethodInfo containsMethod = typeof (string).GetMethod("Contains", new Type[]{typeof (string)});
private static MethodInfo startsWithMethod = typeof (string).GetMethod("StartsWith", new Type[]{typeof (string), typeof (StringComparison)});
private static MethodInfo endsWithMethod = typeof (string).GetMethod("EndsWith", new Type[]{typeof (string)});
public static Expression GetExpression<T>(this ParameterExpression param, ExpressionFilter filter)
MemberExpression member = Expression.Property(param, filter.PropertyName);
ConstantExpression constant = Expression.Constant(filter.Value);
switch (filter.Comparison)
return Expression.Equal(member, constant);
case Comparison.GreaterThan:
return Expression.GreaterThan(member, constant);
case Comparison.GreaterThanOrEqual:
return Expression.GreaterThanOrEqual(member, constant);
case Comparison.LessThan:
return Expression.LessThan(member, constant);
case Comparison.LessThanOrEqual:
return Expression.LessThanOrEqual(member, constant);
case Comparison.NotEqual:
return Expression.NotEqual(member, constant);
case Comparison.Contains:
return Expression.Call(member, containsMethod, constant);
case Comparison.StartsWith:
return Expression.Call(member, startsWithMethod, constant, Expression.Constant(StringComparison.InvariantCultureIgnoreCase));
case Comparison.EndsWith:
return Expression.Call(member, endsWithMethod, constant);
public class ExpressionFilter
public string PropertyName
public Comparison Comparison