Util应用程序框架公共操作类(十):可空值类型扩展

时间:2022-01-22 10:06:02

  当你使用可空的值类型时,你会发现取值很不方便,比如Guid? obj,你要从obj中获取值,可以使用Value属性obj. Value,但obj可能为null,这时候就会抛出一个异常。

  可空值类型提供了一个HasValue属性,它可以识别出obj是不是一个null值,每当你获取可空值都需要加上这个判断if(value.HasValue){ var value = obj.Value;}。

  下面我们通过几个扩展方法,把判断封装起来。

  在Util项目中添加Extensions.Nullable.cs,代码如下。

using System;

namespace Util {
/// <summary>
/// 扩展 - 可空类型
/// </summary>
public static partial class Extensions {
/// <summary>
/// 安全返回值
/// </summary>
/// <param name="value">可空值</param>
public static int SafeValue( this int? value ) {
return value.HasValue ? value.Value : ;
} /// <summary>
/// 安全返回值
/// </summary>
/// <param name="value">可空值</param>
public static Guid SafeValue( this Guid? value ) {
return value.HasValue ? value.Value : Guid.Empty;
} /// <summary>
/// 安全返回值,为null返回DateTime.MinValue
/// </summary>
/// <param name="value">可空值</param>
public static DateTime SafeValue( this DateTime? value ) {
return value.HasValue ? value.Value : DateTime.MinValue;
} /// <summary>
/// 安全返回值
/// </summary>
/// <param name="value">可空值</param>
public static bool SafeValue( this bool? value ) {
return value.HasValue && value.Value;
} /// <summary>
/// 安全返回值
/// </summary>
/// <param name="value">可空值</param>
public static double SafeValue( this double? value ) {
return value.HasValue ? value.Value : ;
} /// <summary>
/// 安全返回值
/// </summary>
/// <param name="value">可空值</param>
public static decimal SafeValue( this decimal? value ) {
return value.HasValue ? value.Value : ;
}
}
}

  在Util.Tests测试项目的Extensions目录中,添加NullableExtensionTest,代码如下。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Util.Tests.Extensions {
/// <summary>
/// 可空类型扩展
/// </summary>
[TestClass]
public class NullableExtensionTest {
/// <summary>
/// 测试可空整型
/// </summary>
[TestMethod]
public void TestSafeValue_Int() {
int? value = null;
Assert.AreEqual( , value.SafeValue() ); value = ;
Assert.AreEqual( , value.SafeValue() );
} /// <summary>
/// 测试可空Guid
/// </summary>
[TestMethod]
public void TestSafeValue_Guid() {
Guid? value = null;
Assert.AreEqual( Guid.Empty, value.SafeValue() ); value = Guid.NewGuid();
Assert.AreEqual( value.Value, value.SafeValue() );
} /// <summary>
/// 测试可空DateTime
/// </summary>
[TestMethod]
public void TestSafeValue_DateTime() {
DateTime? value = null;
Assert.AreEqual( DateTime.MinValue, value.SafeValue() ); value = Conv.ToDate( "2000-1-1" );
Assert.AreEqual( value.Value, value.SafeValue() );
} /// <summary>
/// 测试可空bool
/// </summary>
[TestMethod]
public void TestSafeValue_Boolean() {
bool? value = null;
Assert.AreEqual( false, value.SafeValue() ); value = true;
Assert.AreEqual( true, value.SafeValue() );
} /// <summary>
/// 测试可空double
/// </summary>
[TestMethod]
public void TestSafeValue_Double() {
double? value = null;
Assert.AreEqual( , value.SafeValue() ); value = 1.1;
Assert.AreEqual( 1.1, value.SafeValue() );
} /// <summary>
/// 测试可空decimal
/// </summary>
[TestMethod]
public void TestSafeValue_Decimal() {
decimal? value = null;
Assert.AreEqual( , value.SafeValue() ); value = 1.1M;
Assert.AreEqual( 1.1M, value.SafeValue() );
}
}
}

  以后通过SafeValue方法就可以安全的获取可空值类型了。

  calvinK同学给出一个更好的方案,代码如下,在此表示感谢。

namespace Util {
/// <summary>
/// 扩展 - 可空类型
/// </summary>
public static partial class Extensions {
/// <summary>
/// 安全返回值
/// </summary>
/// <param name="value">可空值</param>
public static T SafeValue<T>( this T? value ) where T : struct {
return value ?? default( T );
}
}
}

  .Net应用程序框架交流QQ群: 386092459,欢迎有兴趣的朋友加入讨论。

  谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/xiadao521/

  下载地址:http://files.cnblogs.com/xiadao521/Util.2015.1.6.1.rar

Util应用程序框架公共操作类(十):可空值类型扩展的更多相关文章

  1. Util应用程序框架公共操作类&lpar;十二&rpar;&colon;Lambda表达式公共操作类&lpar;三&rpar;

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

  2. Util应用程序框架公共操作类&lpar;七&rpar;&colon;Lambda表达式公共操作类

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

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

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

  4. Util应用程序框架公共操作类&lpar;二&rpar;&colon;数据类型转换公共操作类(源码篇)

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

  5. Util应用程序框架公共操作类&lpar;九&rpar;&colon;Lambda表达式扩展

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

  6. Util应用程序框架公共操作类&lpar;八&rpar;&colon;Lambda表达式公共操作类&lpar;二&rpar;

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

  7. Util应用程序框架公共操作类&lpar;六&rpar;&colon;验证扩展

    前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类. 很多时候,我们会判断一个对象是否为null, ...

  8. Util应用程序框架公共操作类&lpar;五&rpar;&colon;异常公共操作类

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

  9. Util应用程序框架公共操作类&lpar;四&rpar;&colon;验证公共操作类

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

随机推荐

  1. java字符串大小写字母互改

    import java.util.Scanner; public class Test { /** * 测试数据 * * @param args */ public static void main( ...

  2. php正则,删除字符串中的中英文标点符号

    原理很简单,正则查找字符串,然后替换 英文标点符号,正则中有专用的模式来匹配.中文则需要一一列举 代码: <?php $str = "!@#$%^&*(中'文::﹑•中'文中' ...

  3. find查找命令的各种使用方法

    find是文件查找工具,实时查找,速度慢,精确匹配 find命令基本使用格式 find [options] [查找路径] [查找条件] [处理动作] 查找路径:默认为当前目录 查找条件:默认为查找指定 ...

  4. Android线程管理(三)&mdash&semi;&mdash&semi;Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  5. 支持IE6以上阴影效果纯CSS

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. R0:前瞻

    原文链接http://www.wangafu.net/~nickm/libevent-book/Ref0_meta.html Libevent使用手册:前瞻 总览: Libevent是一个用来写高性能 ...

  7. 重新看待Jar包冲突问题及解决方案

    Jar包冲突是老生常谈的问题,几乎每一个Java程序猿都不可避免地遇到过,并且也都能想到通常的原因一般是同一个Jar包由于maven传递依赖等原因被引进了多个不同的版本而导致,可采用依赖排除.依赖管理 ...

  8. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

  9. 一个无锁消息队列引发的血案(五)——RingQueue&lpar;中&rpar; 休眠的艺术

    目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...

  10. shell编程——保留元字符

    在shell中有以下几种字符含有特殊含义,属于保留元字符: & * + ^ $ ` " | ? 当脚本在执行过程中遇到上述字符时,会执行其具有的特殊含义,除非在前面加"\& ...