• 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

  • 相关阅读:
    结对-四则运算-最终程序
    结对- 四则运算器-结对项目总结
    课后作业-阅读任务-阅读提问-3
    课后作业-现代软件工程-阅读笔记
    软件工程课程总结
    团队-学生成绩管理一阶段互评
    结对-英文词频检测程序-测试过程
    团队-学生成绩管理-项目进度
    团队-学生成绩管理-模块开发过程
    eclipse下的文件路径问题
  • 原文地址:https://www.cnblogs.com/xiadao521/p/4206780.html
Copyright © 2020-2023  润新知