Util应用程序框架公共操做类(六):验证扩展

  前面介绍了仓储的基本操做,下面准备开始扩展查询,在扩展查询以前,首先要增长两个公共操做类,一个是常常要用到的验证方法,另外一个是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

相关文章
相关标签/搜索