小当家ISV
互联网高新技术服务商

全球共有10多个国家和地区1000多个平台,20万+商户使用

Expression表达式目录树

作者:    李炳坤       发布时间:     2024-03-23          235      分类专栏: 后端开发

1. 基本了解

1.1 Lambda表达式

Lambda表达式是一个特殊的匿名函数,是一种高效的类似于函数式编程的表达式,简化开发中需要编写的代码量

可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式

所有Lambda表达式都使用Lambda运算符=>,运算符的左边是输入参数(如果有),右边是表达式或语句块

Lambda表达式不能在委托链中进行删(-=)操作,因为每个表达式的名称都不一样


2. 表达式目录树Expression

2.1 简单概述

表达式树,ExpressionSystem.Linq.Expressions),是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算,或者说是描述不同变量和常用之间关系的一种数据结构

表达式目录树以数据形式表示语言级别代码,数据存储在树形结构中,目录树中的每个节点都表示一个表达式,简单的说是一种语法树,或者说是一种数据结构

表达式目录树不能有语句体,不能当作方法,不能有大括号,只能有一行代码

2.2 声明表达式目录树

第一种方式,快捷声明,用Lambda声明表达式目录树

示例一:普通类型

Expression<Func<int, int, int>> exp = (n, m) => n * m + 2;

示例二:实体类声明

Expression<Func<User, bool>> lambda = x => x.age > 18;

第二种方式,手动拼装目录树(原始方式),简单示例

namespace e1

{

    using System;

    using System.Linq.Expressions;

    class Program

    {

        static void Main(string[] args)

        {

            // 以此表达式为例,手动拼接,实现相同作用

            Expression<Func<int, int, int>> func = (x, y) => x * y + 2;


            // 声明变量表达式

            ParameterExpression px = Expression.Parameter(typeof(int), "x");

            ParameterExpression py = Expression.Parameter(typeof(int), "y");


            // 声明常量表达式

            ConstantExpression constant = Expression.Constant(2, typeof(int));


            // 声明乘积表达式

            BinaryExpression multiply = Expression.Multiply(px, py);


            // 声明相加表达式

            BinaryExpression add = Expression.Add(multiply, constant);


            // 声明参数表达式

            ParameterExpression[] parameters = new ParameterExpression[] { px, py };


            // 生成表达式目录树

            Expression<Func<int, int, int>> exp = Expression.Lambda<Func<int, int, int>>(add, parameters);


            // 表达式目录树生成委托

            var ifunc = exp.Compile();


            Console.WriteLine("委托结果:" + func.Compile().Invoke(1, 2));

            Console.WriteLine("表达式树:" + ifunc.Invoke(1, 2));

        }

    }

}

2.3 表达式类型

方法类型描述
Expression.Parameter(...)ParameterExpression表示一个命名参数(变量)表达式
Expression.Constant(...)ConstantExpression表示具有常量值的表达式
Expression.Add(...)BinaryExpression表示具有(+,-,*,/)运算的表达式
Expression.Property/Field(...)MemberExpression表示访问属性或字段
Expression.Call(...)MethodCallExpression表示对静态方法或实例方法的调用
Expression.Condition(...)ConditionalExpression表示包含条件运算符的表达式
LambdaExpression描述一个Lambda表达式
ListInitExpression表示包含集合初始值设定项的构造函数调用
NewExpression表示构造函数调用
NewArrayExpression表示创建新数组并可能初始化改数组的元素
MemberMemberBinding表示初始化新创建对象的成员的成员
MemberInitExpression表示调用构造函数并初始化新对象的一个或多个成员
MemberAssignment表示初始化新创建对象的字段或属性
InvocationExpression表示将委托或Lambda表达式应用于参数表达式列表的表达式
TypeBinaryExpression表示表达式和类型之间的操作
UnaryExpression

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


3. 应用:解析Expression示例

3.1 示例一:简单示例,生成SQL

using System;

using System.Linq.Expressions;


namespace e2

{

    internal static class SqlOperator

    {

        internal static string ToSqlOperator(this ExpressionType type)

        {

            switch (type)

            {

                case (ExpressionType.AndAlso):

                case (ExpressionType.And):

                    return "AND";

                case (ExpressionType.OrElse):

                case (ExpressionType.Or):

                    return "OR";

                case (ExpressionType.Not):

                    return "NOT";

                case (ExpressionType.NotEqual):

                    return "<>";

                case ExpressionType.GreaterThan:

                    return ">";

                case ExpressionType.GreaterThanOrEqual:

                    return ">=";

                case ExpressionType.LessThan:

                    return "<";

                case ExpressionType.LessThanOrEqual:

                    return "<=";

                case (ExpressionType.Equal):

                    return "=";

                default:

                    throw new Exception("不支持该方法");

            }

        }

    }

}

Expression一般都是都是配合委托一起来使用的,比如和委托Action,Func

Expression<Func<T>>是可以转成Func的(通过compile()方法转换),反之则不行

所属分类: 后端开发
C#基础学习-- 封装
各类型集合基础使用方法

小当家,帮您把生意越做越大!

小当家ISV,重庆APP开发,小程序开发,软件系统开发 地址:重庆市南岸区南坪万达广场写字楼2栋19-6 联系电话:023-81361879

ICP备案号:渝ICP备15003473-1 增值电信业务许可证: 渝B2-15003473 渝公网安备 50010802005103号

友情链接: 小当家点餐收银系统   MagicShop商城  重庆微信营销  重庆智能家居  重庆红岭医院 

重庆小当家互联网信息技术有限公司