Util应用程序框架公共操作类(十):可空值类型扩展
当你使用可空的值类型时,你会发现取值很不方便,比如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应用程序框架公共操作类(十):可空值类型扩展的更多相关文章
- Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)
今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...
- Util应用程序框架公共操作类(七):Lambda表达式公共操作类
前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...
- Util应用程序框架公共操作类
随笔分类 - Util应用程序框架公共操作类 Util应用程序框架公共操作类 Util应用程序框架公共操作类(五):异常公共操作类 摘要: 任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务 ...
- Util应用程序框架公共操作类(二):数据类型转换公共操作类(源码篇)
上一篇介绍了数据类型转换的一些情况,可以看出,如果不进行封装,有可能导致比较混乱的代码.本文通过TDD方式把数据类型转换公共操作类开发出来,并提供源码下载. 我们在 应用程序框架实战十一:创建VS解决 ...
- Util应用程序框架公共操作类(九):Lambda表达式扩展
上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...
- Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)
前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...
- Util应用程序框架公共操作类(六):验证扩展
前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类. 很多时候,我们会判断一个对象是否为null, ...
- Util应用程序框架公共操作类(五):异常公共操作类
任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务上的错误进行简单支持. 对于刚刚接触.Net的新手,碰到错误的时候,一般喜欢通过返回bool值的方式指示是否执行成功. public boo ...
- Util应用程序框架公共操作类(四):验证公共操作类
为了能够验证领域实体,需要一个验证公共操作类来提供支持.由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点. .Net提供了一个 ...
随机推荐
- C++构造函数/析构函数 设置成private的原因
C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...
- myBatis中 collection 或 association 联合查询 中column 传入多个参数值
下面是一个树形结构表自连接 联合查询 Demo <resultMap id="BaseResultMap" type="com.maidan.daas.entit ...
- WebService的开发、部署、调用
本文参考其它文章和自己解决中间问题的经历记录,以C#开发WebService为例子,欢迎探讨: 一.C#开发WebService 在visual studio中新建ASP.NET Web服务应用程序, ...
- Hadoop 2.6.0 Namenode HA,ResourceManager HA
先启动所有的zookeeper zkServer.sh start 在所有节点上启动JournalNode: sbin/hadoop-daemon.sh start journalnode 格式化第一 ...
- [转]runtime 消息机制
原文地址:http://www.jianshu.com/p/f6300eb3ec3d 一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtim ...
- WiFi流量劫持—— JS脚本缓存投毒
在上一篇<WiFi流量劫持—— 浏览任意页面即可中毒>构思了一个时光机原型,让我们的脚本通过HTTP缓存机制,在未来的某个时刻被执行,因此我们可以实现超大范围的入侵了. 基于此原理,我们用 ...
- ABP理论学习之多租户
返回总目录 本篇目录 什么是多租户 ABP中的多租户 什么是多租户 维基百科:"软件多租户是指一种软件架构,在这种软件架构中,软件的一个实例运行在服务器上并且为多个租户服务".一个 ...
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- Nodejs之MEAN栈开发(一)---- 路由与控制器
因为工作需要,最近再次学习了node,上一次学习node是2014年,纯粹是个人兴趣,学了入门之后没有运用,加上赶别的项目又不了了之.这次正好捡起来.废话不多说,这里的MEAN指的是Mongodb.E ...
- iOS开发系列--视图切换
概述 在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单.在iOS开发中常用的视图切换有三种,今天我们将一一介绍: UITabBarController ...