首页 > 代码库 > Util应用程序框架公共操作类(十一):表达式生成器

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, 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

Util应用程序框架公共操作类(十一):表达式生成器