本篇介紹的表達式生成器,用於動態建立表達式。express
在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() ); } } }
因爲目前的功能比較簡單,因此只添加了兩個方法,後面須要的時候再擴展。測試
準備工做已經就緒,下一篇能夠介紹查詢條件及日期範圍、數值範圍條件封裝。ui
.Net應用程序框架交流QQ羣: 386092459,歡迎有興趣的朋友加入討論。spa
謝謝你們的持續關注,個人博客地址:http://www.cnblogs.com/xiadao521/code
下載地址:http://files.cnblogs.com/xiadao521/Util.2015.1.6.1.rarblog