using System.Linq.Expressions;
public DateTime Date { get; set; }
public string FirstName {get; set; }
public static void Main()
ParameterExpression param = Expression.Parameter(typeof(Model), "x");
var property = Expression.Property(param, "Date");
ConstantExpression constant = Expression.Constant(new DateTime(2015, 1, 1), typeof(DateTime));
Expression finalExpression = Expression.LessThanOrEqual(property, constant);
var utcNow = DateTime.UtcNow;
Expression<Func<Model, string>> handMaidExpression = x => $"This is {x.FirstName} and an enum {MyEnum.Two} and {utcNow}";
Console.WriteLine(handMaidExpression.Type);
Console.WriteLine(handMaidExpression.Parameters[0]);
Console.WriteLine(handMaidExpression.Body);
var method = (MethodCallExpression)handMaidExpression.Body;
Console.WriteLine(method.Method);
var arg0 = (ConstantExpression)method.Arguments[0];
Console.WriteLine(arg0.Value);
var arg1 = (MemberExpression)method.Arguments[1];
Console.WriteLine(arg1.Member);
Console.WriteLine(arg1.Expression.GetType());
Console.WriteLine(arg1.Expression == handMaidExpression.Parameters[0]);
var arg2 = (UnaryExpression)method.Arguments[2];
var agr2Const = (ConstantExpression)arg2.Operand;
Console.WriteLine(Convert.ToInt64(agr2Const.Value));
Console.WriteLine(arg2.NodeType);
var paramListExpr = Expression.Lambda<Func<object[]>>(Expression.NewArrayInit(typeof(object), arg2, method.Arguments[3]));
Console.WriteLine(paramListExpr);
var argValues = paramListExpr.Compile().Invoke();
Console.WriteLine(argValues.Length);
Console.WriteLine(Convert.ToInt64(argValues[0]));
Console.WriteLine(argValues[1]);