static void TreeCombination() {
Expression<Func<double, double, double>> rectArea = (b, h) => b * h;

ParameterExpression x = Expression.Parameter(typeof(double), "x" );
ParameterExpression y = Expression.Parameter(typeof(double), "y");
ParameterExpression z = Expression.Parameter(typeof(double), "z");
Expression area = Expression.Invoke(rectArea, new Expression[] { x, y });
Expression multiply = Expression.Multiply(z, area);
Expression<Func<double,double,double,double>> volume =
Expression.Lambda<Func<double,double,double,double>>(
multiply,
new ParameterExpression[] { x, y, z });

Console.WriteLine("Plocha = {0}", rectArea.ToString());
Console.WriteLine("Objem = {0}", volume.ToString());
Console.WriteLine("Hodnota plochy = {0}", rectArea.Compile()(20, 10));
Console.WriteLine("Hodnota objemu = {0}", volume.Compile()(20, 10, 8));
}
