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.rzrgm.cn/xiadao521/
下載地址:https://files.cnblogs.com/xiadao521/Util.2015.1.6.1.rar

浙公網安備 33010602011771號