Util应用程序框架公共操作类(十一):表达式生成器
本篇介绍的表达式生成器,用于动态创建表达式。
在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应用程序框架公共操作类(十一):表达式生成器的更多相关文章
- Util应用程序框架公共操作类
随笔分类 - Util应用程序框架公共操作类 Util应用程序框架公共操作类 Util应用程序框架公共操作类(五):异常公共操作类 摘要: 任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务 ...
- Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)
今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...
- Util应用程序框架公共操作类(七):Lambda表达式公共操作类
前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...
- Util应用程序框架公共操作类(二):数据类型转换公共操作类(源码篇)
上一篇介绍了数据类型转换的一些情况,可以看出,如果不进行封装,有可能导致比较混乱的代码.本文通过TDD方式把数据类型转换公共操作类开发出来,并提供源码下载. 我们在 应用程序框架实战十一:创建VS解决 ...
- Util应用程序框架公共操作类(九):Lambda表达式扩展
上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...
- Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)
前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...
- Util应用程序框架公共操作类(六):验证扩展
前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类. 很多时候,我们会判断一个对象是否为null, ...
- Util应用程序框架公共操作类(五):异常公共操作类
任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务上的错误进行简单支持. 对于刚刚接触.Net的新手,碰到错误的时候,一般喜欢通过返回bool值的方式指示是否执行成功. public boo ...
- Util应用程序框架公共操作类(四):验证公共操作类
为了能够验证领域实体,需要一个验证公共操作类来提供支持.由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点. .Net提供了一个 ...
随机推荐
- Xml 建议优先使用属性
要点:建议优先选用属性的方式记录数据,除非还需要包容层级式的数据. 优点: 1. 可以完全覆盖关系型数据库的数据格式设计,利于交换. 2. 占用空间小.相当于 JSON 格式,不再有大量重复的节点名后 ...
- Redis 做消息队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...
- Python使用总结二
近来因为工作需要,用Python比较多,写得多了,收获也多.借此记录总结一下,方便以后反思. 一.IDE的选择 1.notepad++加上cmd窗口 前些时候写python脚本都用notepad++编 ...
- [转]Android ListView 与 RecyclerView 对比浅析—缓存机制
从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...
- 有关DTCoreText无法加载网络图片及应用问题
至于DTCoreText是干嘛的,不清楚的同学自行网上脑补,这就不啰嗦了,只说一下其用法. 里面有三种控件供大家使用,DTAttributedTextView, DTAttributedLabel 和 ...
- 06.DOM操作应用高级
获取表格tBodies.tHead.tFoot.rows获取行 cells获取td隔行变色 <!DOCTYPE HTML> <html> <head> <m ...
- 一鼓作气 博客--第四篇 note4
1.元祖允许重复数据.只读元组,列表,元祖没有增删改查,比如身份证列表,不允许修改,就存成 元祖. 2. 字典 key-value对 特性: 无顺序 去重 查询速度快,比列表快多了 比list占用内存 ...
- CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...
- sessionStorage/localStorage 本地存储
if(!sessionStorage.getItem('vote2')||sessionStorage.getItem('vote2')==NaN)sessionStorage.setItem(' ...
- 测试MailUtils,作用是发邮件
package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...