using System.Linq.Expressions;
public static void Main(string[] args)
ParameterExpression param = Expression.Parameter(typeof(Test), "obj");
Expression a = Expression.Property(param, "A");
Expression b = Expression.Property(param, "B");
Expression result = CustomCombine(a, b);
var lambda = Expression.Lambda<Func<Test, int>>(result, new ParameterExpression[] { param });
Func<Test, int> func = lambda.Compile();
Console.WriteLine("Result is " + val);
private static Expression CustomCombine(Expression a, Expression b)
var variable = Expression.Variable(a.Type, "cached");
var aVal = Expression.Assign(variable, a);
var mult = Expression.Multiply(variable, b);
var result = Expression.Add(mult, variable);
var block = Expression.Block(new ParameterExpression[]{variable}, aVal, result);
Console.WriteLine("Property A is accessed");