using System.Linq.Expressions;
private static Action<int> printIntValue = x => Console.WriteLine(x);
private static Expression CreateNonStringCompareExpression(Expression firstExpression, Expression secondExpression)
Type returnType = typeof(int);
ParameterExpression expressionResult = Expression.Parameter(returnType, "expressionResult");
Expression result = Expression.Block(
new ParameterExpression[]
Expression.LessThan(firstExpression, secondExpression),
Expression.Assign(expressionResult, Expression.Constant(-1)),
Expression.GreaterThan(firstExpression, secondExpression),
Expression.Assign(expressionResult, Expression.Constant(1)),
Expression.Assign(expressionResult, Expression.Constant(0)))),
Expression.Invoke(Expression.Constant(printIntValue), new Expression[] { firstExpression }),
Expression.Invoke(Expression.Constant(printIntValue), new Expression[] { secondExpression }),
public static void Main()
ParameterExpression inputValue = Expression.Parameter(typeof(int), "inputValue");
Expression leftExpression = Expression.Block(
new ParameterExpression[]
Expression.Invoke(Expression.Constant(printIntValue), new Expression[] { inputValue }),
Expression.AddAssign(inputValue, Expression.Constant(5)),
Expression.Invoke(Expression.Constant(printIntValue), new Expression[] { inputValue }),
Action<int> leftLambda = Expression.Lambda<Action<int>>(leftExpression, new ParameterExpression[] {inputValue}).Compile();
result = Expression.Block(
expressions: new Expression[]
ParameterExpression leftValueParam = Expression.Parameter(typeof(int), "leftValue");
ParameterExpression rightValueParam = Expression.Parameter(typeof(int), "rightValue");
Expression<Func<int, int, int>> lambda2Expression = Expression.Lambda<Func<int, int, int>>(CreateNonStringCompareExpression(leftValueParam, rightValueParam),
new ParameterExpression[]
Func<int, int, int> lambda2 = lambda2Expression.Compile();
Console.WriteLine(lambda2(3,5));