本篇介绍的表达式生成器,用于动态创建表达式。

  在Util项目Lambdas目录中,添加ExpressionBuilder,代码如下。

using System;
using System.Linq.Expressions; namespace Util.Lambdas {
/// <summary>
/// 表达式生成器
/// </summary>
public class ExpressionBuilder<TEntity> {
/// <summary>
/// 初始化表达式生成器
/// </summary>
public ExpressionBuilder() {
Parameter = Expression.Parameter( typeof( TEntity ), "t" );
} /// <summary>
/// 参数
/// </summary>
private ParameterExpression Parameter { get; set; } /// <summary>
/// 获取参数
/// </summary>
public ParameterExpression GetParameter() {
return Parameter;
} /// <summary>
/// 创建表达式
/// </summary>
/// <param name="property">属性表达式</param>
/// <param name="operator">运算符</param>
/// <param name="value">值</param>
public Expression Create<T>( Expression<Func<TEntity, T>> property, Operator @operator, object value ) {
return Parameter.Property( Lambda.GetMember( property ) ).Operation( @operator, value );
} /// <summary>
/// 转换为Lambda表达式
/// </summary>
/// <param name="expression">表达式</param>
public Expression<Func<TEntity, bool>> ToLambda( Expression expression ) {
if ( expression == null )
return null;
return expression.ToLambda<Func<TEntity, bool>>( Parameter );
}
}
}

  在Util.Tests测试项目中,添加ExpressionBuilderTest单元测试,代码如下。

using System;
using System.Linq.Expressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Util.Lambdas;
using Util.Tests.Samples; namespace Util.Tests {
/// <summary>
/// 测试表达式生成器
/// </summary>
[TestClass]
public class ExpressionBuilderTest {
/// <summary>
/// 表达式生成器
/// </summary>
ExpressionBuilder<Test2> _builder; /// <summary>
/// 测试初始化
/// </summary>
[TestInitialize]
public void TestInit() {
_builder = new ExpressionBuilder<Test2>();
} /// <summary>
/// 创建表达式
/// </summary>
[TestMethod]
public void TestCreate_Int() {
Expression<Func<Test2, int>> property = t => t.Int;
var expression = _builder.Create( property, Operator.Equal, );
Expression<Func<Test2, bool>> expected = t => t.Int == ;
Assert.AreEqual( expected.ToString(), _builder.ToLambda( expression ).ToString() );
} /// <summary>
/// 创建表达式
/// </summary>
[TestMethod]
public void TestCreate_Int_Nullable() {
Expression<Func<Test2, int?>> property = t => t.NullableInt;
var expression = _builder.Create( property, Operator.Equal, );
Assert.AreEqual( "t => (t.NullableInt == 1)", _builder.ToLambda( expression ).ToString() );
}
}
}

  由于目前的功能比较简单,所以只添加了两个方法,后面需要的时候再扩展。

  准备工作已经就绪,下一篇可以介绍查询条件及日期范围、数值范围条件封装。

  .Net应用程序框架交流QQ群: 386092459,欢迎有兴趣的朋友加入讨论。

  谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/xiadao521/

  下载地址:http://files.cnblogs.com/xiadao521/Util.2015.1.6.1.rar

Util应用程序框架公共操作类(十一):表达式生成器的更多相关文章

  1. Util应用程序框架公共操作类

    随笔分类 - Util应用程序框架公共操作类 Util应用程序框架公共操作类 Util应用程序框架公共操作类(五):异常公共操作类 摘要: 任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务 ...

  2. Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)

    今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...

  3. Util应用程序框架公共操作类(七):Lambda表达式公共操作类

    前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...

  4. Util应用程序框架公共操作类(二):数据类型转换公共操作类(源码篇)

    上一篇介绍了数据类型转换的一些情况,可以看出,如果不进行封装,有可能导致比较混乱的代码.本文通过TDD方式把数据类型转换公共操作类开发出来,并提供源码下载. 我们在 应用程序框架实战十一:创建VS解决 ...

  5. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

  6. Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)

    前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...

  7. Util应用程序框架公共操作类(六):验证扩展

    前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类. 很多时候,我们会判断一个对象是否为null, ...

  8. Util应用程序框架公共操作类(五):异常公共操作类

    任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务上的错误进行简单支持. 对于刚刚接触.Net的新手,碰到错误的时候,一般喜欢通过返回bool值的方式指示是否执行成功. public boo ...

  9. Util应用程序框架公共操作类(四):验证公共操作类

    为了能够验证领域实体,需要一个验证公共操作类来提供支持.由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点. .Net提供了一个 ...

随机推荐

  1. winfrom自定义滚动条

    panel或图片什么的跟着鼠标走,这里panel自己可以加背景图或直接搞个图就行了.为了演示清楚,有个滚动条控件做对比,与自定义的同步. using System; using System.Coll ...

  2. 通读SDWebImage①--总体梳理、下载和缓存

    本文目录 下载操作SDWebImageDownloaderOptions和下载过程实现 下载管理SDWebImageDownloader 缓存SDImageCache SDWebImageManage ...

  3. AngularJS:自定义过滤器

    表达式:         {{ expression | filter1 | filter2 | ... }}         {{ expression | filterName : paramet ...

  4. 关于iOS后台问题( 一 )(ios后台刷新,后台定位,后台下载,真后台)

    关于iOS的后台,以下引用一些文段进行一下脑补,请同学们大致看一下,有个基础,原文出处 -------------------------------------------------------- ...

  5. PHP DOS漏洞的新利用:CVE-2015-4024 Reviewed

    1.     背景介绍 今天我们想从2015.04.03的一个PHP远程dos漏洞(CVE-2015-4024)说起.技术细节见如下链接,https://bugs.php.net/bug.php?id ...

  6. java并发编程(十四)同步问题的内存可见性

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另 ...

  7. html、canvas、视频灰度、反色

    效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. ThreadLocal对象使用过程中容易陷入的坑

    ThreadLocal对象帮助我们管理线程内的对象,保证对象在线程之间是相互隔离的. 今天碰到的坑是这样的: index01.html页面加载的时候会发送一次a请求,然后点击附件上传的时候会发送上传请 ...

  9. C# Just want 入门

    1. 终于明白为什么以前的程序在结尾部分会经常出现 input any key to exit! using System; namespace ConsoleApplication1 { class ...

  10. CYQ.Data 批量添加数据性能测试(每秒千、万)

    今天有网友火晋地同学进了CYQ.Data官方群了,他正在折腾了一个各大ORM性能测试的比较的软件,如下图 折腾的种类也不少: 感觉这软件折腾的不错~~~值的期待~~~ 另外,他指出CYQ.Data 在 ...