lambda表达树

什么是表达式树

表达式树核心:将代码作为数据。它将一些代码表示为一个对象树,树中的每个节点本身都是一个表达式,不同的表达式类型代表能在代码中执行不同操作:二元操作,一元操作,方法调用等等。

System.Linq.Expressions命名空间包含了代表表达式的各个类。所有的表达式类都从Expression类派生,Expression是个抽象类,主要包含的是一些静态的方法,这些方法用于生成其他表达式类的实例。Expression类还包含了两个重要属性:

  1. Type
  2. NodeType

​​​​​​​表达式树编译成委托

LambdaExpression是从Expression派生的类型。泛型类Expression是从LambdaExpression派生的,其中泛型参数TDelegate必须是委托类型。

 

LambdaExpression有个Compile方法能创建恰当类型的一个委托。而Expression的Compile方法返回TDelegate类型的委托

 

lambda表达树_第1张图片

​​​​​​​Lambda表达式转换成表达式树

Lambda表达式能显示或隐式地转换成恰当的委托实例。但是,编译器也能很轻松的将Lambda表达式构建为一个表达式树:

//将Lambda表达式转换成表达式树

Expression> return5 = () => 5;

 

但是,并不是所有的Lambda表达式都能转换成表达式树,有一些限制:不能将带有一个语句块的Lambda转换成一个表达式树-----只有对单个表达式进行求值得Lambda才可以。表达式中不能包含赋值操作,因为表达式树中表示不了这种操作。

 

 

 

实例

效果图

lambda表达树_第2张图片

 

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel.Design.Serialization;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace Lambda表达树
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1、利用Lambda表达式创建表达式树
            /*
			 * 当Lambda表达式分配给 Expression,编译器会把Lambda表达式编译成表达式树
			 * 局限:仅限单行语句,多行不可以。
			 */

            //将Lambda表达式转换为类型Expression的表达式树。
            //Expression> expr = (x, y) => {return x + y;};//编译报错,表达式不能转换为方式
            Expression> expr = (x, y) => x + y;
            //Func func = (i, i1) =>
            //{
            //    return i + i1;
            //};
            {
                //控制台输出expression。
                Console.WriteLine(expr);
            }
            {
                Console.WriteLine("==============Body=========");
                //控制台输出Lamda表达式主体
                Console.WriteLine(expr.Body);
            }
            {
                //5.控制台输出Lambda表达式的参数。(10分)
                Console.WriteLine("==============Parameters=========");
                foreach (var parameterExpression in expr.Parameters)
                {
                    Console.WriteLine(parameterExpression.Name);
                }
            }
            {
                //6.控制台输出Lambda表达式树left的参数表达式名以及节点类型。
                Console.WriteLine("==============Left=========");
                BinaryExpression binary = (BinaryExpression) expr.Body;
                var left = binary.Left;
                Console.WriteLine($"left:{left},noteType:{left.NodeType}");
            }

            {
                //7.控制台输出Lambda表达式树right的参数表达式名以及节点类型
                Console.WriteLine("==============Right=========");
                BinaryExpression binary = (BinaryExpression)expr.Body;
                var right = binary.Right;
                Console.WriteLine($"right:{right},noteType:{right.NodeType}");
            }
            {
                //8.将表达式树转换成委托addDelegate。
                var addDelegate = expr.Compile();//将表达式编译为委托
                var result = addDelegate(3,8);
                Console.WriteLine(result);
            }
            

            Console.ReadKey();
        }
    }
}

 

你可能感兴趣的:(C#)