本篇介绍的表达式生成器,用于动态创建表达式。
在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, 1 ); Expression<Func<Test2, bool>> expected = t => t.Int == 1; 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, 1 ); 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
时间: 2024-10-18 16:25:09