表达式目录树(一)

简介: (一)Lambda创建表达式目录树 Expression exp1 = (a, b) => a * b+2;   说明一下:Func Func)   泛型委托:封装一个具有两个参数并返回 TResult 参数指定的类型值的方法。

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

Expression < Func < int int int >>  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(
1 2 );
}

 

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

public   int  GetFunc( int  a, int  b)
{
    Func
< int int int >  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 < int int int >> (Add, a, b); 

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

 

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

(四)使用

Expression < Func < int int int >>  lexp  =  Expression.Lambda < Func < int int int >> (Add, a, b);
Func
< int int int >  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

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
Linux API Windows
linux系统中利用QT实现蓝牙功能的方法
linux系统中利用QT实现蓝牙功能的方法
974 0
|
Java 数据库
SpringBoot手动取消接口执行方案
实际开发中经常会遇到比较耗时的接口操作,但页面强制刷新或主动取消接口调用后后台还是会继续运行,特别是有大量数据库操作时会增加服务器压力,所以进行研究测试后总结了一套主动取消接口调用的解决方案
233 0
|
Docker 容器 关系型数据库
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
本期课程将于4月11日19:00开始直播,内容包括源码编译基础知识和实践操作,课程目标是使学员掌握源码编译部署技能,为未来发展奠定基础,期待大家在课程中取得丰富的学习成果!
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
|
8月前
|
弹性计算 人工智能 自然语言处理
OS Copilot——面向未来的AI大模型
阿里云的智能助手`OS Copilot`是一款基于大模型构建的操作系统智能助手,支持自然语言问答、辅助命令执行、系统运维调优等功能。
367 8
OS Copilot——面向未来的AI大模型
|
10月前
|
监控 Java Shell
监控堆外第三方监控工具Zabbix
监控堆外第三方监控工具Zabbix
225 5
|
11月前
|
存储 前端开发 JavaScript
通过dem2terrain生成MapboxGL地形服务
通过dem2terrain生成MapboxGL地形服务
243 8
|
前端开发
背景滑动,动感加倍:CSS动画对角线效果全解析!
背景滑动,动感加倍:CSS动画对角线效果全解析!
|
存储 缓存 监控
X86架构服务器硬件设计
8月更文挑战第16天
477 0
|
存储 Ubuntu Oracle
在Ubuntu 14.04上安装和配置Elasticsearch的方法
在Ubuntu 14.04上安装和配置Elasticsearch的方法
177 0
|
存储 算法 Java
趣味算法:滑动窗口算法的理解与应用
前言 在编程和数据结构中,滑动窗口算法是一种常见的解决问题的方法。它主要用于处理涉及连续或固定长度子数组、子序列或子字符串的问题。本文将深入探讨滑动窗口算法,包括其基本概念、应用场景、基本步骤以及具体的Java代码实践。
865 0