iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#表达式树基础教程
  • 784
分享到

C#表达式树基础教程

2024-04-02 19:04:59 784人浏览 八月长安
摘要

什么是表达式树 来自微软官方文档的定义: 表达式树以树形数据结构表示代码。 它能干什么呢? 你可以对表达式树中的代码进行编辑和运算。 这样能够动态修改可执行代码、在不同数据库中执行

什么是表达式树

来自微软官方文档的定义:

表达式树以树形数据结构表示代码。

它能干什么呢?

你可以对表达式树中的代码进行编辑和运算。 这样能够动态修改可执行代码、在不同数据库中执行 LINQ 查询以及创建动态查询。

好不好玩?

表达式树还能用于动态语言运行时 (DLR) 以提供动态语言和 .net Framework 之间的互操作性,同时保证编译器编写员能够发射表达式树而非 Microsoft 中间语言 (MSIL)。

哪里有应用?

ORM框架、工作流框架等,使用到 Lambda 的代码。。。动态执行代码、动态组装代码等。

创建表达式树

创建表达式树有两种方式:通过 lambda 表达式、通过 api

创建表达式树的意思是,在此之前已经编写好每个结点,最后使用代码将所有结点组合起来,生成表达式树。

示例(通过API创建表达式树)

            ParameterExpression a = Expression.Parameter(typeof(int), "i");
            ParameterExpression b = Expression.Parameter(typeof(int), "j");

            Expression r1 = Expression.Multiply(a, b);      //乘法运行
            ParameterExpression c = Expression.Parameter(typeof(int), "x");
            ParameterExpression d = Expression.Parameter(typeof(int), "y");
            Expression r2 = Expression.Multiply(c, d);      //乘法运行

            Expression result = Expression.Add(r1, r2);     //相加
            //以上代码产生结点
            //生成表达式
            Expression<Func<int, int, int, int, int>> func = Expression.Lambda<Func<int, int, int, int, int>>(result, a, b, c, d);
            var com = func.Compile();
            Console.WriteLine("表达式" + func);
            Console.WriteLine(com(12, 12, 13, 13));
            Console.ReadKey();

上面关于表达式树的代码很多,以下这一步叫生成/创建表达式树。

            Expression<Func<int, int, int, int, int>> func = Expression.Lambda<Func<int, int, int, int, int>>(result, a, b, c, d);

以下这句叫执行表达式树

            var com = func.Compile();

其它代码是用于生成表达式树结点/逻辑。

回归正题,创建表达式树的两种方法。

lambda 创建表达式树

上面的表达式树示例,是用于生成

 ( i * j ) + ( x * y ) 

但是就这么简单的操作,要写这么长,实在不合理。

而通过 lambda ,可以这样写

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

如果使用 lambda 生成表达式树, lambda 只能使用单行语句,不能使用 if、for等语句。

具体关于 Lambda 的表达式树,后面其它文章有说明。

通过 API 创建表达式树

就是这样

Expression<Func<int, int, int, int, int>> func = Expression.Lambda<Func<int, int, int, int, int>>(result, a, b, c, d);

两种方式左边的都是一样的,区别在于等号右边。

Expression< TDelegate >

上面示例的最终结果都是生成

Expression<Func<int, int, int, int, int>> func 

func 是表达式树变量。

我们可以了解以下表达式树具有的方法和属性。

用于生成表达式树结点的,是 Expression 类型。

那么,创建的表达式树 func ,是 Expression<TDelegate> 类型。

定义如下

public sealed class Expression<TDelegate> : LambdaExpression

具有方法如下

定义

方法说明
Compile()将表达式树描述的 lambda 表达式编译为可执行代码,并生成表示 lambda 表达式的委托。
Compile(Boolean)将表达式树描述的 Lambda 表达式编译为已解释或已编译的代码,并生成表示该 Lambda 表达式的委托。
Compile(DebugInfoGenerator)将 lambda 编译到方法定义中。 (Inherited from LambdaExpression)
Update(Expression, IEnumerable)创建一个与此表达式类似的新表达式,但使用所提供的子级。 如果所有子级都相同,则将返回此表达式。
Accept(ExpressionVisitor)调度到此节点类型的特定 Visit 方法。 例如,MethodCallExpression调用 VisitMethodCall。

由于 Expression<TDelegate> 继承了 LambdaExpression,所以有很多属性方法也可以用。

LambdaExpression

Body获取 lambda 表达式的主体。
CanReduce指示可将节点简化为更简单的节点。 如果返回 true,则可以调用 Reduce() 以生成简化形式。
Name获取 lambda 表达式的名称。
nodeType返回此 Expression 的节点类型。
Parameters获取 lambda 表达式的参数。
ReturnType获取 lambda 表达式的返回类型。
TailCall获取一个值,该值指示是否将通过尾调用优化来编译 lambda 表达式。
Type获取此 Expression 表示的表达式的静态类型。

好了,以上权当小笔记,备忘,目前先用不上,后面慢慢来使用。

解析/执行表达式树

创建表达式树后,就要执行表达式树。

在此之前,你需要了解 委托 Delegate,Func,Action,以及他们中间的关系。

执行表达式树是这样子的

            Expression<Func<int, int, int, int, int>> func = Expression.Lambda<Func<int, int, int, int, int>>(result, a, b, c, d);
            var com = func.Compile();
            var runRasult = com(12, 12, 13, 13);

func 只是一个表达式树,我们把表达式树构建好后,“要将表达式树转为代码”,使用

.Compile() 方法,可以将表达式树生成一个 委托(例如上面的 com)。

为了简洁上面使用了 var,实际上是这样的

            Func<int,int,int,int,int> com = func.Compile();

四个参数,一个返回值。

var runRasult = com(12, 12, 13, 13);

C#里有语法糖,对委托可以这样写

        Expression<Func<int, int, int, int, int>> func = Expression.Lambda<Func<int, int, int, int, int>>(result, a, b, c, d);

        int runRasult = func.Compile()(12, 12, 13, 13);

以后后面都是这样写了,能够缩成一行的代码,就没必要写出两行。

在 Vs 里面调试和查看表达式树,可以看这里

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/expression-trees/debugging-expression-trees-in-visual-studio

到此这篇关于C#表达式树基础教程的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#表达式树基础教程

本文链接: https://www.lsjlt.com/news/162837.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#表达式树基础教程
    什么是表达式树 来自微软官方文档的定义: 表达式树以树形数据结构表示代码。 它能干什么呢? 你可以对表达式树中的代码进行编辑和运算。 这样能够动态修改可执行代码、在不同数据库中执行 ...
    99+
    2024-04-02
  • C#表达式树Expression基础讲解
    什么是表达式树 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等。可以对表达式树中的代码进行编辑和运算。 这样能够动态...
    99+
    2024-04-02
  • C#表达式树讲解
    表达式树的概念 表达式树的创建有 Lambda法 和 组装法。学习表达式树需要 委托、Lambda、Func<> 基础。...
    99+
    2024-04-02
  • C#表达式树Expression动态创建表达式
    目录创建 QueryEntity 类创建 OperatorEnum 类创建 ExpressionExtension 类使用示例单条件查询多条件查询多表查询上一篇中说到了 Expres...
    99+
    2024-04-02
  • 正则表达式基础与常用验证表达式
    目录一、正则元字符1、 字符元字符2、重复元字符(量词)3、定位元字符4、分组和替换字符5、特殊字符6、需要转义的字符7、贪婪与非贪婪匹配8、常见正则表达式二、正则表达式应用举例1、...
    99+
    2024-04-02
  • 怎么用C#表达式树Expression动态创建表达式
    本篇内容介绍了“怎么用C#表达式树Expression动态创建表达式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在一些管理后台中,对数据进...
    99+
    2023-06-22
  • C# Lambda表达式树怎么实现
    这篇文章主要介绍“C# Lambda表达式树怎么实现”,在日常操作中,相信很多人在C# Lambda表达式树怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C# Lambda表达式树怎么实现”的疑惑有所...
    99+
    2023-06-17
  • C#表达式树Expression怎么创建
    本篇内容介绍了“C#表达式树Expression怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是表达式树表达式树以树形数据结构表...
    99+
    2023-06-22
  • JSP之EL表达式基础详解
    一、EL表达式简介 EL表达式全称:Expression Language,即表达式语言 EL表达式作用:代替JSP页面中表达式脚本进行数据的输出 EL表达...
    99+
    2024-04-02
  • 【Java 基础篇】Java 正则表达式
    文章目录 导言一、正则表达式的基本概念二、使用正则表达式的步骤三、示例代码1. 匹配字符串2. 提取匹配的内容3. 替换字符串 总结 导言 正则表达式是一种强大的文本模式匹配工具...
    99+
    2023-09-18
    java 正则表达式 python
  • C# 表达式目录树Expression的实现
    目录表达式目录树表达式目录树的拼装应用Linq to SQLExpressionVisitor表达式目录扩展通过表达式目录树实现表达式目录树 表达式目录树:语法树,或者说是一种数据结...
    99+
    2024-04-02
  • C#基础知识之字符串和正则表达式
    目录Stringstring 和 stringbuilder字符串格式$前缀StringFormat转义花括号日期时间和数字的格式正则表达式组总结String System.Stri...
    99+
    2024-04-02
  • C#判断语句的表达式树实现
    C# 提供了以下类型的判断语句: 语句描述if一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。if...else一个 if 语句 后...
    99+
    2024-04-02
  • web正则表达式基础与常用验证表达式是什么
    这篇文章主要介绍了web正则表达式基础与常用验证表达式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web正则表达式基础与常用验证表达式是什么文章都会有所收获,下面我们一起来看看吧。一、正则元字符是一些在...
    99+
    2023-07-02
  • C++使用正则表达式的详细教程
    目录正则表达式RE库组件正则表达式的使用regex迭代器类型smatch相关操作子表达式子表达式用于数据验证子匹配操作regex_replace总结 正则表达式 正则表达式...
    99+
    2024-04-02
  • python正则表达式re.search()的基本使用教程
    1 re.search() 的作用: re.search会匹配整个字符串,并返回第一个成功的匹配。如果匹配失败,则返回None  从源码里面可以看到re.search()方...
    99+
    2024-04-02
  • vue实例成员 插值表达式 过滤器基础教程示例详解
    目录一. 什么是Vue二.为什么学Vue三.如何使用Vue下载安装?插值表达式四、vue特点1.虚拟DOM2.数据的双向绑定3.单页面应用4.数据驱动五、Vue实例六、实例成员- 挂...
    99+
    2024-04-02
  • 如何在C#项目中创建一个Lambda表达式和Lambda表达式树
    如何在C#项目中创建一个Lambda表达式和Lambda表达式树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。表达式Lambda  表达式位于 => 运算符右侧的 l...
    99+
    2023-06-06
  • Java正则表达式基础语法详解
    目录什么是正则表达式?字符范围匹配:元字符:多次重复匹配:定位匹配:总结什么是正则表达式? 1、正则表达式是检擦、匹配字符串的表达式 2、正则表达式是描述规则,主流语言都有良好支持...
    99+
    2024-04-02
  • 【Java基础】Java正则表达式的使用
    文章目录 一、正则表达式规则1.字符类(只匹配一个字符)2.预定义字符(只匹配一个字符)3.数量词 二、使用方法三、例题演示 一、正则表达式规则 1.字符类(只匹配一个字符) [a...
    99+
    2023-09-29
    正则表达式 java jvm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作