存在可与表达式树配合使用的 .NET Core framework 中的类的大型列表。 可以在 System.Linq.Expressions 查看完整列表。 让我们来了解一下 framework 类的设计方式,而不是逐一查看完整列表。

在语言设计中,表达式是可计算并返回值的代码主体。 表达式可能非常简单:常数表达式 1 返回常数值 1。 它们可能更复杂:表达式 (-B + Math.Sqrt(B*B - 4 * A * C)) / (2 * A) 返回二次方程的一个根(若方程有解)。

System.Linq.Expression

使用表达式树的其中一个难点在于许多不同类型的表达式在程序中的许多位置均有效。 请思考一个赋值表达式。 赋值的右侧可以是常数值、变量、方法调用表达式或其他内容。 语言灵活性意味着,遍历表达式树时,可能会在树的节点中的任意位置遇到许多不同的表达式类型。 因此,使用基表达式类型时,理解起来最简单。 但是,有时你需要了解更多内容。 为此,基表达式类包含 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# 语言提供的丰富词汇的功能所必需的。

导航 API

存在映射到 C# 语言的几乎所有语法元素的表达式节点类型。 每种类型都有针对该种语言元素的特定方法。 需要一次性记住的内容很多。 我不会记住所有内容,而是会采用有关使用表达式树的技巧,如下所示:

  1. 查看 ExpressionType 枚举的成员以确定应检查的可能节点。 如果想要遍历和理解表达式树,这将非常有用。
  2. 查看 Expression 类的静态成员以生成表达式。 这些方法可以从其子节点集生成任何表达式类型。
  3. 查看 ExpressionVisitor 类,以生成一个经过修改的表达式树。

C#3.0新增功能10 表达式树 03 支持表达式树的框架类型的更多相关文章

  1. C#3.0新增功能10 表达式树 05 解释表达式

    连载目录    [已更新最新开发文章,点击查看详细] 表达式树中的每个节点将是派生自 Expression 的类的对象. 该设计使得访问表达式树中的所有节点成为相对直接的递归操作. 常规策略是从根节点 ...

  2. C#3.0新增功能10 表达式树 07 翻译(转换)表达式

    连载目录    [已更新最新开发文章,点击查看详细] 本篇将介绍如何访问表达式树中的每个节点,同时生成该表达式树的已修改副本. 以下是在两个重要方案中将使用的技巧. 第一种是了解表达式树表示的算法,以 ...

  3. C#3.0新增功能10 表达式树 01 简介

    连载目录    [已更新最新开发文章,点击查看详细] 如果你使用过 LINQ,则会有丰富库(其中 Func 类型是 API 集的一部分)的经验. (如果尚不熟悉 LINQ,建议阅读 LINQ 教程,以 ...

  4. C#3.0新增功能10 表达式树 02 说明

    连载目录    [已更新最新开发文章,点击查看详细] 表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构.表达式树和 Roslyn API 中用于生成分析器和 Cod ...

  5. C#3.0新增功能10 表达式树 06 生成表达式

    连载目录    [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expressi ...

  6. C#3.0新增功能10 表达式树 04 执行表达式

    连载目录    [已更新最新开发文章,点击查看详细] 表达式树 是表示一些代码的数据结构. 它不是已编译且可执行的代码. 如果想要执行由表达式树表示的 .NET 代码,则必须将其转换为可执行的 IL ...

  7. C#3.0新增功能09 LINQ 基础08 支持 LINQ 的 C# 功能

    连载目录    [已更新最新开发文章,点击查看详细] 查询表达式 查询表达式使用类似于 SQL 或 XQuery 的声明性语法来查询 IEnumerable 集合. 在编译时,查询语法转换为对 LIN ...

  8. C#3.0新增功能09 LINQ 基础03 LINQ 和泛型类型

    连载目录    [已更新最新开发文章,点击查看详细] LINQ 查询基于 .NET Framework 版本 2.0 中引入的泛型类型. 无需深入了解泛型即可开始编写查询. 但是,可能需要了解 2 个 ...

  9. C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点

    C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点   第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...

随机推荐

  1. BoxedApp Packer 将您的原始应用“打包”成单个完全的可执行二进制文件

    及时应对移动化趋势 在没有安装到本地硬盘驱动的情况下,使用闪存卡.网络文件夹或者可移动磁盘远程启动应用程序通常是一件令人头疼的事,你会发现,应用程序会突然会丢失文件.路径错误或者远程注册表故障等一系列 ...

  2. BI-学习之 商业智能项目工具安装

    首先咱们先需要下载一个工具,Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2012并安装: 我目前 ...

  3. 推荐一些C#相关的网站、资源和书籍 (转载自http://blog.csdn.net/chinacsharper/article/details/17514923)

    一.网站 1.http://msdn.microsoft.com/zh-CN/ 微软的官方网站,C#程序员必去的地方.那里有API开发文档,还有各种代码.资源下载. 2.http://social.m ...

  4. arcgis api for js 4.X 出现跨域问题

    arcgis api for js 4.X 出现跨域问题 XMLHttpRequest cannot load http://localhost/4.3/4.3/esri/workers/mutabl ...

  5. Python连载12-shutil模块

    一.shutil模块 1.函数:copy() (1)用法:复制文件0 (2)格式:copy(来源路径,目标路径) (3)返回值:返回目标路径 (4)注意:拷贝的同时可以给文件重命名 source_pa ...

  6. 报错:java.sql.SQLException: The server

    报错:java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized 在IDEA运行是报出例如相识的错误时: ...

  7. (数据科学学习手札62)详解seaborn中的kdeplot、rugplot、distplot与jointplot

    一.简介 seaborn是Python中基于matplotlib的具有更多可视化功能和更优美绘图风格的绘图模块,当我们想要探索单个或一对数据分布上的特征时,可以使用到seaborn中内置的若干函数对数 ...

  8. ASP.NET Core Web API中使用Swagger

    本节导航 Swagger介绍 在ASP.NET CORE 中的使用swagger   在软件开发中,管理和测试API是一件重要而富有挑战性的工作.在我之前的文章<研发团队,请管好你的API文档& ...

  9. Git的忽略、分支、分支与主线的合并、远程仓库的操作

    如果想了解 Git 以及一些基础命令的使用,请看我的另一篇博客: http://www.cnblogs.com/haojun/p/7797508.html 这篇博客会跟大家介绍一下怎么在提交的时候忽略 ...

  10. Solr配置文件 schema.xml

    1 添加自己的分词器(mmseg4j) 意思是textCommplex 这个类型,用的是 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory 这个分词器,词库是 ...