前面介紹了倉儲的基本操做,下面準備開始擴展查詢,在擴展查詢以前,首先要增長兩個公共操做類,一個是常常要用到的驗證方法,另外一個是Lambda表達式的操做類。框架
不少時候,咱們會判斷一個對象是否爲null,因爲null是一個不能接受的值,它會致使「未將對象引用設置到對象的實例」的嚴重錯誤,因此當檢測到null值時通常直接拋出ArgumentNullException異常。單元測試
public void Test( string name ) { if( name == null ) throw new ArgumentNullException( "name" ); //其它操做
}
因爲判斷null是一個頻繁操做,能夠用一個擴展方法來封裝它,像下面這樣調用。測試
public void Test( string name ) { name.CheckNull( "name" ); //其它操做
}
我直接將CheckNull擴展到object對象上,由於絕大部分對象都須要這個操做。注意,擴展object要很是謹慎,會致使大面積污染,由於全部對象都會看見這個擴展方法,若是這個操做對某些對象有反作用,就會形成更多混亂。ui
另外一個經常使用的方法也是判斷是否爲空,好比字符串的」」,或者Guid的Guid.Empty。this
對於string,咱們通常經過string.IsNullOrWhiteSpace來進行判斷。spa
public void Test( string name ) { if ( string.IsNullOrWhiteSpace( name ) ) return; //其它操做
}
使用擴展方法封裝後,簡化爲下面的代碼。code
public void Test( string name ) { if ( name.IsEmpty() ) return; //其它操做
}
IsEmpty擴展方法,我定義在string、Guid、Guid?等具體類型上,不能擴展到object,由於每種類型的實現不一樣,固然能夠進行各類判斷,但執行效率可能很是低下,畢竟這是一個經常使用方法。對象
在Util項目中添加Extensions.Validate文件,它是Extensions的部分類,代碼以下。blog
using System; namespace Util { /// <summary>
/// 驗證擴展 /// </summary>
public static partial class Extensions { /// <summary>
/// 檢測空值,爲null則拋出ArgumentNullException異常 /// </summary>
/// <param name="obj">對象</param>
/// <param name="parameterName">參數名</param>
public static void CheckNull( this object obj, string parameterName ) { if ( obj == null ) throw new ArgumentNullException( parameterName ); } /// <summary>
/// 是否爲空 /// </summary>
/// <param name="value">值</param>
public static bool IsEmpty( this string value ) { return string.IsNullOrWhiteSpace( value ); } /// <summary>
/// 是否爲空 /// </summary>
/// <param name="value">值</param>
public static bool IsEmpty( this Guid? value ) { if ( value == null ) return true; return IsEmpty( value.Value ); } /// <summary>
/// 是否爲空 /// </summary>
/// <param name="value">值</param>
public static bool IsEmpty( this Guid value ) { if ( value == Guid.Empty ) return true; return false; } } }
單元測試代碼以下。字符串
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Util.Tests.Extensions { /// <summary>
/// 驗證擴展測試 /// </summary>
[TestClass] public class ValidateExtensionTest { /// <summary>
/// 檢查空值,不爲空則正常執行 /// </summary>
[TestMethod] public void TestCheckNull() { var test = new object(); test.CheckNull( "test" ); } /// <summary>
/// 檢查空值,值爲null則拋出異常 /// </summary>
[TestMethod] [ExpectedException( typeof( ArgumentNullException ) )] public void TestCheckNull_Null_Throw() { try { object test = null; test.CheckNull( "test" ); } catch ( ArgumentNullException ex ) { Assert.IsTrue( ex.Message.Contains( "test" ), ex.Message ); throw; } } /// <summary>
/// 測試是否空值 /// </summary>
[TestMethod] public void TestIsEmpty_String() { string value = null; Assert.IsTrue( value.IsEmpty() ); Assert.IsTrue( "".IsEmpty() ); Assert.IsTrue( " ".IsEmpty() ); Assert.IsFalse( "a".IsEmpty() ); } /// <summary>
/// 測試是否空值 /// </summary>
[TestMethod] public void TestIsEmpty_Guid() { Guid value = Guid.Empty; Assert.IsTrue( value.IsEmpty() ); value = Guid.NewGuid(); Assert.IsFalse( value.IsEmpty() ); } /// <summary>
/// 測試是否空值 /// </summary>
[TestMethod] public void TestIsEmpty_Guid_Nullable() { Guid? value = null; Assert.IsTrue( value.IsEmpty() ); value = Guid.Empty; Assert.IsTrue( value.IsEmpty() ); value = Guid.NewGuid(); Assert.IsFalse( value.IsEmpty() ); } } }
本文簡單介紹了兩個驗證方法的擴展,下一篇將介紹對Lambda表達式的操做進行封裝,它是對IQueryable核心Where方法擴展的基礎。
我在下載的代碼中已經加入了後面兩篇須要用到的代碼文件,有興趣能夠下載。
.Net應用程序框架交流QQ羣: 386092459,歡迎有興趣的朋友加入討論。
謝謝你們的持續關注,個人博客地址:http://www.cnblogs.com/xiadao521/
下載地址:http://files.cnblogs.com/xiadao521/Util.2014.12.22.1.rar