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/
下载地址:https://files.cnblogs.com/xiadao521/Util.2015.1.6.1.rar
分类:
Util应用程序框架公共操作类
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战