动态生成C# Lambda表达式

转载:http://www.educity.cn/develop/1407905.html,并整理!

  对于C# Lambda的理解我们在之前的文章中已经讲述过了,那么作为Delegate的进化使用,为了让代码简洁和优雅的呈现,C# Lambda表达式的使用功不可灭,那么依托外部条件如何动态构建C# Lambda表达式呢。下面让我们来具体的看看实施。

  或许你会奇怪这个需求是如何产生的…… 首先,Lambda 在 DLinq 中承担了以往 T-SQL 的部分角色;其次,在数据库设计中,我们往往需要依据外部未知的动态条件组合来查询数据。而问题在于作为一种静态语言,我们显然无法用动态语法或者拼接字符串的方法来创建一个Delegate/Lambda,那么如何达到类似的目的呢?CodeDom?Emit?或许最佳的选择是 System.Linq.Expressions.Expression。

  1、首先我们了解一个简单C# Lambda表达式的构成。

i => i > 5

  在这个表达式中,"i" 被称为 Parameter,"i > 5" 是 Body。我们可以对 Body 进行更进一步的分解,那么 "i > 5" 分别包含参数(i)、操作符(>)以及一个常数(5)。所有这些通过特定顺序的组合,从而构建一个完整的 Lambda 表达式。

  2、我们通过一些例子,来学习如何动态构建C# Lambda表达式。

  动态构建C# Lambda表达式例子①

  1、准备例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  2、要实现的表达式 

var r = ints.Where(i => i > 5);

  3、动态创建该表达式具体代码

// 创建参数 i
var parameter =
Expression.Parameter(typeof(int), "i");
  
// 创建常量5
var constant =
Expression.Constant(5);
  
// 创建比较表达式 i > 5
var bin =
Expression.GreaterThan(parameter, constant);
  
// 获取Lambda表达式
var lambda =
Expression.Lambda<Func<int, bool>>(bin, parameter);
  
// 通过 Compile 方法获取 Delegate
var _r = ints.Where(lambda.Compile());

  

  动态构建C# Lambda表达式例子②

  1、准备例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  2、要实现的表达式 

var r = ints.Where(i => i > 5 && i <= 7);

  3、动态创建该表达式具体代码

// 创建参数 i
var parameter =
Expression.Parameter(typeof(int), "i");
  
// 创建表达式 i > 5
var con1 =
Expression.Constant(5);
var bin1 =
Expression.GreaterThan(parameter, con1);
  
// 创建表达式 i <= 7
var con2 =
Expression.Constant(7);
var bin2 =
Expression.LessThanOrEqual(parameter, con2);
  
// 组合两个表达式
var body =
Expression.And(bin1, bin2);
  
// 获取 Lambda 表达式
var lambda =
Expression.Lambda<Func<int, bool>>(body, parameter);
  
var _r = ints.Where(lambda.Compile());

  在例子②中,我们对复杂的表达式进行了分解,并使用 And 完成多个表达式的组装,由此我们可以创建更加复杂的逻辑组合,比如例子③。

  动态构建C# Lambda表达式例子③

  1、准备例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  2、要实现的表达式 

var r = ints.Where(i => (i > 5 && i <= 7) || (i == 3));

  3、动态创建该表达式具体代码

// 创建参数 i
var parameter =
Expression.Parameter(typeof(int), "i");  

// 创建表达式 i > 5
var con1 =
Expression.Constant(5);
var bin1 =
Expression.GreaterThan(parameter, con1);  

// 创建表达式 i < 7
var con2 =
Expression.Constant(7);
var bin2 =
Expression.LessThanOrEqual(parameter, con2);  

// 创建表达式 i == 3
var con3 =
Expression.Constant(3);
var bin3 =
Expression.Equal(parameter, con3);  

// 组合 i > 5 && i <= 7
var body =
Expression.And(bin1, bin2);  

// 组合 ( i > 5 && i <= 7) OR (i == 3)
body = Expression.Or(body, bin3);  

var lambda =
Expression.Lambda<Func<int, bool>>
(body, parameter);
var _r = ints.Where(lambda.Compile());

  

  动态构建C# Lambda表达式例子④

  1、准备例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  2、要实现的表达式 

var r = ints.Select(i => i % 2 == 0 ? i : 0);

  3、动态创建该表达式具体代码

// 创建参数 i
var parameter =
Expression.Parameter(typeof(int), "i");  

// 创建表达式 i % 2
var con1 =
Expression.Constant(2);
var bin1 =
Expression.Modulo(parameter, con1);  

// 创建表达式 (i % 2) == 0
var con2 =
Expression.Constant(0);
var bin2 =
Expression.Equal(bin1, con2);  

// 创建表达式 IIF(((i % 2) = 0), i, 0)
var bin3 =
Expression.Condition
(bin2, parameter, Expression.Constant(0));  

var lambda =
Expression.Lambda<Func<int, int>>(bin3, parameter);
var _r = ints.Select(lambda.Compile());

  动态构建C# Lambda表达式例子⑤

  1、准备例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  2、要实现的表达式 

Array.ForEach<int>(ints, i => Console.WriteLine(i));

  3、动态创建该表达式具体代码

// 创建参数i
var parameter =
Expression.Parameter(typeof(int), "i");  

// 获取 Console.WriteLine MethodInfo
MethodInfo method =
typeof(Console).GetMethod(
"WriteLine", new Type[] { typeof(int) });  

// 创建表达式
var call = Expression.Call(method, parameter);  

var lambda =
Expression.Lambda<Action<int>>(call, parameter);
Array.ForEach<int>(
ints, lambda.Compile());

  

  是该花点时间去好好研究一下 System.Linq.Expressions Namespace 了……

  动态构建C# Lambda表达式的基本内容就向你介绍到这里,希望那个对你了解和掌握使用动态构建C# Lambda表达式有所帮助。

时间: 2024-10-10 12:20:29

动态生成C# Lambda表达式的相关文章

Java 8 动态类型语言Lambda表达式实现原理分析

Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标. import java.util.function.Consumer; public class Lambda { public static void main(String[] args) { Consumer<String> c = s -> System.out.println(s); c.accept("hello lambd

动态生成lambda表达式

//1.0 获取我的申请单 int uid = UserMgr.GetCurrentLoginUser().uID; //2.0 获取参数 string kname = f["kname"]; string status = f["status"]; //第一个条件: var query= c => c.fCreatorID == uid //定义出一个c的参数,它的类型为wfReqeustForm var ps = Expression.Parameter(

Lambda表达式详解【转】

前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一. lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”.运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体. lambda表达式: 1.一个参数:param=>expr 2

Lambda表达式详解

前言 lambda:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一. lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”.运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体. lambda表达式: 1.一个参数:param=>expr 2.多个参数:(param-list)=>expr 上面这些东西,记着,下面我们

通过字节码分析JDK8中Lambda表达式编译及执行机制

关于Lambda字节码相关的文章,很早之前就想写了,[蜂潮运动]APP 产品的后端技术,能快速迭代,除了得益于整体微服架构之外,语言层面上,也是通过Java8的lambda表达式的运用以及rxJava响应式编程框架,使代码更加简洁易维护,调用方式更加便捷.本文将介绍JVM中的方法调用相关的字节码指令,重点解析JDK7(JSR-292)之后新增的invokedynamic指令给lambda表达式的动态调用特性提供的实现机制,最后再探讨一下lambda性能方面的话题. 方法调用的字节码指令 在介绍i

C# Lambda表达式详解,及Lambda表达式树的创建

最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介.优雅. Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式.所有Lambda表达式都使

Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)

Lambda表达式详解(例子详解) lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,"转到"或者 "成为".运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体. lambda表达式: 1.一个参数:param=>expr 2.多个参数:(param-list)=>expr 上面这些东西,记着,下面我们开始应用并阐述lambda,让你乐在其中.

【转】Lambda表达式详解

前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一. lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”.运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体. lambda表达式: 1.一个参数:param=>expr 2

Lambda表达式树构建(上)

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