解析 Lambda 表达式

我们先创建一个表达式树:

Expression<Func<int, int, int>> expression = (a,b) => a + b;

我们的例子是一个Expression<TDelegate>。Expression<TDelegate>类有四个属性:

  • Body: 得到表达式的主体。
  • Parameters: 得到lambda表达式的参数.
  • NodeType: 获取树的节点的ExpressionType。共45种不同值,包含所有表达式节点各种可能的类型,例如返回常量,例如返回参数,例如取两个值的小值(<),例如取两个值的大值(>),例如将值相加(+),等等。
  • Type: 获取表达式的一个静态类型。在这个例子里,表达式的类型是Func<intintint>

下面就写Code来解析

            Expression<Func<int, int, int>> expression = (a, b) => a + b;
            BinaryExpression body = (BinaryExpression)expression.Body;
            ParameterExpression left = (ParameterExpression)body.Left;
            ParameterExpression right = (ParameterExpression)body.Right;
            Console.WriteLine(expression.Body);
            Console.WriteLine(" 表达式左边部分: " + "{0}{4} 节点类型: {1}{4} 表达式右边部分: {2}{4} 类型: {3}{4}", left.Name, body.NodeType, right.Name, body.Type, Environment.NewLine);

输出:

(a + b)
  表达式左边部分: a
  节点类型:  Add
  表达式右边部分: b
  类型: System.Int32

我们可以调用Compile()方法来生成委托对象

int res = expression.Compile()(3, 5);

这段代码会输出值8,跟本文最初声明的lambda函数的执行结果一样。

Expression参考博客:http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html

时间: 2024-11-09 00:52:39

解析 Lambda 表达式的相关文章

Lambda表达式树解析(下)

概述 前面章节,总结了Lambda树的构建,那么怎么解析Lambda表达式树那?Lambda表达式是一种委托构造而成,如果能够清晰的解析Lambda表达式树,那么就能够理解Lambda表达式要传递的正式意图.解析Lambda表达式树意义很大,比如我们用的EF框架.Rafy框架,里面封装了大量的Lambda查询表达式,通过解析表达式转换成SQL语句,即可以查询数据库,将数据呈现给前台用户: Lambda表达式树解析 下面代码块是标识Express各个节点的信息,ExpressionType.Cal

lambda表达式封装对数据库的查询

前言: 1.为什么要封装lambda表达式数据库查询,原因有一下几点: 1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询,当数据多和用户量多时,查询的效率会降低. 1.2.在写查询where条件的时候,总是用string.format去拼接字符串,开发效率低. 1.3.代码不够优雅,代码中嵌套和多sql语句,如果是表字段发生改变时编译器检查不出来,代码出错的概率大. 1.4.本着 write less  do more

Lambda表达式树构建(上)

概述 Lambda是C#常用的语句,采用委托等方式,来封装真实的代码块.Lambda其实就是语法糖,是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式.常用的方法有Where.Select.SelectMany.Aggregate等:语法结构SomeList.Where(p=>p.property==value),其中SomeList基础

Lambda表达式的前世今生

Lambda 表达式 早在 C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. 通常情况下,使用委托来传递函数需要一定的步骤: 定义一个委托,包含指定的参数类型和返回值类型. 在需要接收函数参数的方法中,使用该委托类型定义方法的参数签名. 为指定的被传递的函数创建一个委托实例. 可能这听起来有些复杂,不过本质上说确实是这样.上面的第 3 步通常不是必须的,C# 编译器能够完成

【Java8实战】Lambda表达式(一)

Java 8的Lambda表达式借鉴了C#和Scala等语言中的类似特性,简化了匿名函数的表达方式.Lambda表达式可以直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例.什么是函数式接口?简单来说就是只包含一个抽象方法的接口,允许有默认的实现(使用default关键字描述方法).函数式接口建议使用@FunctionalInterface注解标注,虽然这不是必须的,但是这样做更符合规范. 在Java 8之前,实现Runnable常用方式是编写一个匿名类: Thr

Python学习_列表解析和Lambda表达式

1.根据要求创建列表threes_and_fives(列表值包括1到15中能够被3或者5正常的数) threes_and_fives=[x for x in range(1,16) if x%3==0 or x%5==0] 2.lambda表达式实例(剔除掉列表中的"X") garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX" message

将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

public class DemoClass { /// <summary> /// 通过Lambda表达式,在构造函数中赋初始值 /// </summary> /// <param name="propertyFunc"></param> /// <param name="propertyValue"></param> public DemoClass (Expression<Func&

用Java8 Stream和 Lambda表达式来解析文件的一个例子

最近我想从一个日志文件中提取出指定的数据,下面是日志的一部分: 2015-01-06 11:33:03 b.s.d.task [INFO] Emitting: eVentToRequestsBolt __ack_ack [-6722594615019711369 -1335723027906100557] 2 2015-01-06 11:33:03 c.s.p.d.PackagesProvider [INFO] ===---> Loaded package com.foo.bar 3 2015-

今夜我懂了Lambda表达式_解析

现在时间午夜十一点~ 此刻的我血脉喷张,异常兴奋:因为专注得学习了一把java,在深入集合的过程中发现好多套路配合Lambda表达式真的是搜椅子,so开了个分支,决定从"只认得",变为"我懂得" start: 先上一盘代码,对应来解析: /*我是一个接口*/ interface Rap{ void show(); //注意:虽然没有用abstract修饰方法,但它真是抽象方法,我特意去试了下,应该是没有方法体的方法默认在前面加abstract } /*我是二个接口*