• 表达式目录树(一)


    (一)Lambda创建表达式目录树

    Expression<Func<intintint>> exp1 = (a, b) => a * b+2;

    说明一下:Func

    Func<(Of <(T1, T2, TResult>)>)

    泛型委托:封装一个具有两个参数并返回 TResult 参数指定的类型值的方法。

    T1:此委托封装的方法的第一个参数类型。

    T2:此委托封装的方法的第二个参数类型。

    Tresult:此委托封装的方法的返回值类型。

    例如:现在求2个int类型的和

    (1) 原始的方法

    public int Add(int a, int b)
    {
        
    return a + b;
    }

    (2)通过委托来实现

    delegate int deleAdd(int a, int b);
    public void DeleConcrete()
    {
        deleAdd deleadd
    = Add;
        deleadd(
    12);
    }

    (3)直接通过泛型委托Func来实现

    public int GetFunc(int a,int b)
    {
        Func
    <intintint> add = Add;
        
    return add(a, b);
    }

    (二)分解表达式目录树

    这点可能想到小学数学中的四则运算。对于a*b+2来说,先算乘,再算加

        用图表示为:

     

    每个矩形框为一个节点(表达式类型),节点有多种类型。

    附表表达式类型:

       

    说明

    BinaryExpression

    表示包含二元运算符的表达式。

    ConditionalExpression

    表示包含条件运算符的表达式。

    ConstantExpression

    表示具有常量值的表达式。

    ElementInit

    表示 IEnumerable 集合的单个元素的初始值设定项。

    Expression

    提供一种基类,表示表达式目录树节点的类派生自该基类。它还包含用来创建各种节点类型的 static(在 Visual Basic 中为 Shared)工厂方法。这是一个 abstract 类。

    Expression<(Of <(TDelegate>)>)

    以表达式目录树的形式将强类型 lambda 表达式表示为数据结构。无法继承此类。

    InvocationExpression

    表示将委托或 lambda 表达式应用于参数表达式列表的表达式。

    LambdaExpression

    描述一个 lambda 表达式。

    ListInitExpression

    表示包含集合初始值设定项的构造函数调用。

    MemberAssignment

    表示初始化新创建对象的字段或属性。

    MemberBinding

    提供一种基类,该基类派生表示绑定的类,这些绑定用于初始化新创建对象的成员。

    MemberExpression

    表示访问字段或属性。

    MemberInitExpression

    表示调用构造函数并初始化新对象的一个或多个成员。

    MemberListBinding

    表示初始化新创建对象的集合成员的元素。

    MemberMemberBinding

    表示初始化新创建对象的成员的成员。

    MethodCallExpression

    表示调用一种方法。

    NewArrayExpression

    表示创建新数组并可能初始化该新数组的元素。

    NewExpression

    表示构造函数调用。

    ParameterExpression

    表示命名的参数表达式。

    TypeBinaryExpression

    表示表达式和类型之间的操作。

    UnaryExpression

    表示包含一元运算符的表达式。

     

    而这个(a+b)*2的几个节点:

    ·a,b是参数,类型为ParameterExpression

    ·+*,为二元运符,类型为BinaryExpression

    ·2为常量,类型为ConstantExpression

    (三)通过表达式类型来创建目录树

       a*b+2

    节点有4个,2个参数,2个运算符,1个常量

    ·两个参数

    //两个参数
    ParameterExpression a = Expression.Parameter(typeof(int), "a");
    ParameterExpression b 
    = Expression.Parameter(typeof(int), "b"); 

    //求积
    BinaryExpression Multi=Expression.Multiply(a,b); 

    //常量
    ConstantExpression x2 = Expression.Constant(2); 

    //求和
    BinaryExpression Add = Expression.Add(Multi, x2); 

    //创建一个表示lambda表达式的对象
    LambdaExpression lexp = Expression.Lambda<Func<intintint>>(Add, a, b); 

    //查看表达式
    Console.WriteLine(lexp.ToString());

    创建方法是通过Expression的工厂方法来创建。

    (四)使用

    Expression<Func<intintint>> lexp = Expression.Lambda<Func<intintint>>(Add, a, b);
    Func
    <intintint> fun = lexp.Compile();
    Console.WriteLine(fun(
    3,5));

     

    更多内容请参见:

    ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_fxadvance/html/fb1d3ed8-d5b0-4211-a71f-dd271529294b.htm

    http://kb.cnblogs.com/page/42509/?page=1

  • 相关阅读:
    vue-cli3配置开发环境和生产环境
    vue配置开发环境和生产环境
    js实现div拖拽互换位置效果
    axios用post提交的数据格式
    面试题会被问及哪些?(总结)
    深入理解vue
    nodejs 前端项目编译时内存溢出问题的原因及解决方案
    MUI框架开发HTML5手机APP(一)--搭建第一个手机APP
    关于if省略{}时的一些问题
    函数声明的两种形式的区别
  • 原文地址:https://www.cnblogs.com/jams742003/p/1630432.html
Copyright © 2020-2023  润新知