How do I create a generic Expression that has an expression as a parameter

c# expression-trees func lambda


Exists aDisplayNameFor(x=>x.Title) in ASP.Net MVC, a helper. I wish to change my conduct to reflect something similar.

A method that takes an expression based on what I want would be ideal.User class (u=>u.Birthdate or u=>u.Name), a value, an operand (Greater, Less, Equal), andDateTime.Now and brings back a statementu=>u.Birthdate > DateTime.Now

I am aware that I will need to manually construct the resultant phrase from fragments. Passing in and processing of property expression is something that I find difficult to understand.

I want to use an approach similar to
GetFilterPredicate(u=>u.Birthdate,FilterOps.GreaterThan,DateTime.Parse("01.01.2013") or

Update: I've made a repository that has the answer to this query and a collection property filtering

12/9/2013 12:49:51 PM

Accepted Answer

Does this meet your requirements?

public class UnitTest1
    public Expression<Predicate<T>> GetFilterPredicate<T, R>(Expression<Func<T, R>> selector, FilterOps operand, R value)
        var parameter = selector.Parameters[0];

        var left = selector.Body;
        var right = Expression.Constant(value);

        var binaryExpression = Expression.MakeBinary(operand.ToExpressionType(), left, right);
        return Expression.Lambda<Predicate<T>>(binaryExpression, parameter);

    public void TestMethod1()
        var p1 = this.GetFilterPredicate((User u) => u.Birthday.TimeOfDay.Hours, FilterOps.LessThan, 12);
        var p2 = this.GetFilterPredicate((User u) => u.Size, FilterOps.Equal, 180);

        var user = new User() { Birthday = new DateTime(2000, 1, 1), Size = 180 };


public enum FilterOps
    GreaterThan, LessThan, Equal
public static class MyExtensions
    public static ExpressionType ToExpressionType(this FilterOps operand)
        switch (operand)
            case FilterOps.GreaterThan: return ExpressionType.GreaterThan;
            case FilterOps.LessThan: return ExpressionType.LessThan;
            case FilterOps.Equal: return ExpressionType.Equal;
            default: throw new NotSupportedException();

public class User { public DateTime Birthday { get; set; } public int Size { get; set; } }
11/5/2013 6:51:23 PM

Popular Answer

I think this is what you want to achieve.

public Func<User, bool> MyMethod<TProperty>(Expression<Func<User, TProperty>> func, ComparisonPredicate op, TProperty value)


public enum ComparisonPredicate

Related Questions

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow