前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是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要非常谨慎,会导致大面积污染,因为所有对象都会看见这个扩展方法,如果这个操作对某些对象有副作用,就会造成更多混乱。

  另一个常用的方法也是判断是否为空,比如字符串的””,或者Guid的Guid.Empty。

  对于string,我们一般通过string.IsNullOrWhiteSpace来进行判断。

public void Test( string name ) {
if ( string.IsNullOrWhiteSpace( name ) )
return;
//其它操作
}

  使用扩展方法封装后,简化为下面的代码。

public void Test( string name ) {
if ( name.IsEmpty() )
return;
//其它操作
}

  IsEmpty扩展方法,我定义在string、Guid、Guid?等具体类型上,不能扩展到object,因为每种类型的实现不同,当然可以进行各种判断,但执行效率可能非常低下,毕竟这是一个常用方法。

  在Util项目中添加Extensions.Validate文件,它是Extensions的部分类,代码如下。

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

Util应用程序框架公共操作类(六):验证扩展的更多相关文章

  1. Util应用程序框架公共操作类(四):验证公共操作类

    为了能够验证领域实体,需要一个验证公共操作类来提供支持.由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点. .Net提供了一个 ...

  2. Util应用程序框架公共操作类(七):Lambda表达式公共操作类

    前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...

  3. Util应用程序框架公共操作类

    随笔分类 - Util应用程序框架公共操作类 Util应用程序框架公共操作类 Util应用程序框架公共操作类(五):异常公共操作类 摘要: 任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务 ...

  4. Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)

    今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...

  5. Util应用程序框架公共操作类(二):数据类型转换公共操作类(源码篇)

    上一篇介绍了数据类型转换的一些情况,可以看出,如果不进行封装,有可能导致比较混乱的代码.本文通过TDD方式把数据类型转换公共操作类开发出来,并提供源码下载. 我们在 应用程序框架实战十一:创建VS解决 ...

  6. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

  7. Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)

    前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...

  8. Util应用程序框架公共操作类(五):异常公共操作类

    任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务上的错误进行简单支持. 对于刚刚接触.Net的新手,碰到错误的时候,一般喜欢通过返回bool值的方式指示是否执行成功. public boo ...

  9. Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)

    上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...

随机推荐

  1. .net工具

    程序名称 作者 说明 文件结构与元数据查看看 AssemblyView1.0   可以查看.net平台下exe,dll源代码的类结构,比如变量,属性,函数,事件的定义. Anakrino   源代码开 ...

  2. VPB和OSGGIS安装

    VPB和OSGGIS安装 转自:http://blog.sina.com.cn/s/blog_668aae780101k6pr.html 第一部分VPB安装 VirtualPlanetBuilder是 ...

  3. 用Eclipse搭建ssh框架

    问:ssh是哪三大框架,以及他们的作用是什么? 答:分别是struts,spring,hibernate. struts的作用是:是web层,其核心是mvc模式,他可以自动获取参数,自动类型转换,自动 ...

  4. 【Beta】Daily Scrum Meeting第四次

    1.任务进度 学号 已完成 接下去要做 502 修复和完善任务列表界面:将几个数据库操作封装起来 登陆时将返回的个人信息更新到本地数据库 509 创建报课表的API 给所有api添加注释:发布任务到服 ...

  5. 转载:iOS开发之让你的应用“动”起来

    在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画 ...

  6. ie8中遇到的兼容问题以及解决方案

    一.CSS3 1.可以通过在css中引入pie.htc,处理兼容问题(可处理的属性) -webkit-box-shadow: 0 1px 5px #ff2826; -webkit-border-rad ...

  7. CentOS7 编译安装 Git 服务器 Centos 7.0 + Git 2.2.0 + gitosis (实测 笔记)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 服务器IP:192.168.1.31 域 ...

  8. windows下装多个node版本的方法(gnvm)

      安装一个支持windows切换node版本的工具 工作中我们可能需要用到一些工具,但这些工具依赖不同版本的node环境,那我们需要来为的切换node的环境吗, window msi安装的用户需要卸 ...

  9. DAO实现查询

    package DB3; import java.sql.*; public class DB { private static String driver="com.microsoft.s ...

  10. PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决。。。

    PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决... 1.当你的PowerDesigner 是新安装时,你得设置可能就会出现一些问题,在这里比如:PDM生成 ...