C#3.0新增功能10 表达式树 03 支持表达式树的框架类型
存在可与表达式树配合使用的 .NET Core framework 中的类的大型列表。 可以在 System.Linq.Expressions 查看完整列表。 让我们来了解一下 framework 类的设计方式,而不是逐一查看完整列表。
在语言设计中,表达式是可计算并返回值的代码主体。 表达式可能非常简单:常数表达式 1 返回常数值 1。 它们可能更复杂:表达式 (-B + Math.Sqrt(B*B - 4 * A * C)) / (2 * A) 返回二次方程的一个根(若方程有解)。
使用表达式树的其中一个难点在于许多不同类型的表达式在程序中的许多位置均有效。 请思考一个赋值表达式。 赋值的右侧可以是常数值、变量、方法调用表达式或其他内容。 语言灵活性意味着,遍历表达式树时,可能会在树的节点中的任意位置遇到许多不同的表达式类型。 因此,使用基表达式类型时,理解起来最简单。 但是,有时你需要了解更多内容。 为此,基表达式类包含 NodeType 属性。 它将返回 ExpressionType,这是可能的表达式类型的枚举。 知道节点的类型后,可以将其转换为该类型,并执行特定操作(如果知道表达式节点的类型)。 可以搜索特定的节点类型,然后使用这种表达式的特定属性。
例如,此代码将打印变量访问表达式的变量的名称。 我的做法是,先查看节点类型,再转换为变量访问表达式,然后查看特定表达式类型的属性:
Expression<Func<int, int>> addFive = (num) => num + ;
if (addFive.NodeType == ExpressionType.Lambda)
{
var lambdaExp = (LambdaExpression)addFive;
var parameter = lambdaExp.Parameters.First();
Console.WriteLine("参数名称:" + parameter.Name);
Console.WriteLine("参数类型:" + parameter.Type);
}
Console.ReadKey();
}
输出结果:

System.Linq.Expression 类还包含许多创建表达式的静态方法。 这些方法使用为子节点提供的参数创建表达式节点。 通过这种方式,可以从其叶节点构建一个表达式。 例如,此代码将生成一个 Add 表达式:
// 加法是“1+2”的加法表达式
var one = Expression.Constant(, typeof(int));
var two = Expression.Constant(, typeof(int));
var addition = Expression.Add(one, two);
从这个简单的示例中,你会发现创建和使用表达式树涉及了许多类型。 该复杂性是提供由 C# 语言提供的丰富词汇的功能所必需的。
存在映射到 C# 语言的几乎所有语法元素的表达式节点类型。 每种类型都有针对该种语言元素的特定方法。 需要一次性记住的内容很多。 我不会记住所有内容,而是会采用有关使用表达式树的技巧,如下所示:
- 查看
ExpressionType枚举的成员以确定应检查的可能节点。 如果想要遍历和理解表达式树,这将非常有用。 - 查看
Expression类的静态成员以生成表达式。 这些方法可以从其子节点集生成任何表达式类型。 - 查看
ExpressionVisitor类,以生成一个经过修改的表达式树。
C#3.0新增功能10 表达式树 03 支持表达式树的框架类型的更多相关文章
- C#3.0新增功能10 表达式树 05 解释表达式
连载目录 [已更新最新开发文章,点击查看详细] 表达式树中的每个节点将是派生自 Expression 的类的对象. 该设计使得访问表达式树中的所有节点成为相对直接的递归操作. 常规策略是从根节点 ...
- C#3.0新增功能10 表达式树 07 翻译(转换)表达式
连载目录 [已更新最新开发文章,点击查看详细] 本篇将介绍如何访问表达式树中的每个节点,同时生成该表达式树的已修改副本. 以下是在两个重要方案中将使用的技巧. 第一种是了解表达式树表示的算法,以 ...
- C#3.0新增功能10 表达式树 01 简介
连载目录 [已更新最新开发文章,点击查看详细] 如果你使用过 LINQ,则会有丰富库(其中 Func 类型是 API 集的一部分)的经验. (如果尚不熟悉 LINQ,建议阅读 LINQ 教程,以 ...
- C#3.0新增功能10 表达式树 02 说明
连载目录 [已更新最新开发文章,点击查看详细] 表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构.表达式树和 Roslyn API 中用于生成分析器和 Cod ...
- C#3.0新增功能10 表达式树 06 生成表达式
连载目录 [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expressi ...
- C#3.0新增功能10 表达式树 04 执行表达式
连载目录 [已更新最新开发文章,点击查看详细] 表达式树 是表示一些代码的数据结构. 它不是已编译且可执行的代码. 如果想要执行由表达式树表示的 .NET 代码,则必须将其转换为可执行的 IL ...
- C#3.0新增功能09 LINQ 基础08 支持 LINQ 的 C# 功能
连载目录 [已更新最新开发文章,点击查看详细] 查询表达式 查询表达式使用类似于 SQL 或 XQuery 的声明性语法来查询 IEnumerable 集合. 在编译时,查询语法转换为对 LIN ...
- C#3.0新增功能09 LINQ 基础03 LINQ 和泛型类型
连载目录 [已更新最新开发文章,点击查看详细] LINQ 查询基于 .NET Framework 版本 2.0 中引入的泛型类型. 无需深入了解泛型即可开始编写查询. 但是,可能需要了解 2 个 ...
- C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点
C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点 第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...
随机推荐
- 小试X64 inline HOOK,hook explorer.exe--->CreateProcessInternalW监视进程创建
原始函数是这样的 kernel32!CreateProcessInternalW: 00000000`7738e750 4c8bdc mov r11,rsp 00000000 ...
- 容器化之Docker小知识普及
Docker确实是个好东西,相当于一个小型虚拟机,里面环境隔离只要有对应的镜像就能运行业务应用.运行基础应用.能跑数据库等等,还能跑linux等等. Docker 从狭义上来讲就是一个进程,从广义上来 ...
- 升级vue全家桶过程记录
背景 如果你使用了element-ui的el-tabs组件,并且想要单独升级element-ui至2.10.0,你会发现,使用了el-tabs组件的页面只要打开就卡死.原因是element-ui~2. ...
- 【练习题】proj2 字符串压缩
输入一个字符串,输出简单的压缩 1)单字符串压缩 : 输入:ABBBCCD , 输出AB3C2D 2)多字符串压缩 输入:AABCABCD,输出A(ABC)2D 1)压缩单个字符 #include & ...
- Scala 学习之路(八)—— 类和对象
一.初识类和对象 Scala的类与Java的类具有非常多的相似性,示例如下: // 1. 在scala中,类不需要用public声明,所有的类都具有公共的可见性 class Person { // 2 ...
- (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
利用JavaScript(JS)实现一个九宫格拖拽功能 Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...
- yii DAO操作总结
数据库代码: /* Navicat MySQL Data Transfer Source Server : lonxom Source Server Version : 50524 S ...
- Android之控件学习
文本域,类似于HTML里的textarea <EditText android:id="@+id/edit_text" android:layout_width=" ...
- 记录微信浏览器里word链接点击没反应的bug
有用户反应点击下载附件时没有反应,让用户把该下载链接复制到微信对话框中,发现点击该链接仍然无反应,但是在内置的手机浏览器中打开是正常的而且可以下载. 链接地址,有需要的可以拿去进行测试: http:/ ...
- PCA(主成分分析)算法
设有\(m\)个指标,\(n\)个样本的原始数据 将原始数据按列组成矩阵 \(X _ { n \times m }\) 将\(X\) 的每一列进行中心化 求\(X\)的协方差矩阵\(\Sigma _ ...