将基于Nullable的类型转换实现在扩展方法中

时间:2022-01-20 01:43:31

三、将基于Nullable<T>的类型转换实现在扩展方法中

从上面的介绍我们可以得出这样的结论:如果类型T1和T2能够相互兼容,我们可以借助Convert将T1类型对象转换成T2类型,然后通过显式类型转换进一步转换成Nullable<T2>。我们可以通过这两个步骤实现针对于Nullable<T>类型的转换。为了操作方便,我将此转换逻辑写在针对IConvertible接口的扩展方法中:

   1: public static class ConvertionExtensions
   2: {
   3:     public static T? ConvertTo<T>(this IConvertible convertibleValue) where T : struct
   4:     {
   5:         if (null == convertibleValue)
   6:         {
   7:             return null;
   8:         }
   9:         return (T?)Convert.ChangeType(convertibleValue, typeof(T));
  10:     }
  11: }

借助于上面这个扩展方法ConvertTo,对于目标类型为Nullable<T>的转换就显得很简单了:

   1: int? intValue           = "123".ConvertTo<int>();
   2: double? doubleValue     = "123".ConvertTo<double>();
   3: DateTime? dateTimeValue = "1981-08-24".ConvertTo<DateTime>();

四、进一步完善扩展方法ConvertTo

上面定义的扩展方法只能完成针对目标类型为Nullable<T>的转换。现在我们来进一步完善它,让这个方法可以实现任意类型之间的转换。下面是我们新版本的ConvertTo方法的定义:

   1: public static T ConvertTo<T>(this IConvertible convertibleValue)
   2: {
   3:     if (null == convertibleValue)
   4:     {
   5:         return default(T);
   6:     }
   7:  
   8:     if (!typeof(T).IsGenericType)
   9:     {
  10:         return (T)Convert.ChangeType(convertibleValue, typeof(T));
  11:     }
  12:     else
  13:     {
  14:         Type genericTypeDefinition = typeof(T).GetGenericTypeDefinition();
  15:         if (genericTypeDefinition == typeof(Nullable<>))
  16:         {
  17:             return (T)Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(typeof(T)));
  18:         }
  19:     }
  20:     throw new InvalidCastException(string.Format("Invalid cast from type \"{0}\" to type \"{1}\".", convertibleValue.GetType().FullName, typeof(T).FullName));

将基于Nullable<T>的类型转换实现在扩展方法中的更多相关文章

  1. 谈谈Nullable&lt&semi;T&gt&semi;的类型转换问题

    本篇文章讨论可空值类型(Nullable<T>)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值.这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章.虽然没有 ...

  2. struts基于ognl的自动类型转换需要注意的地方

    好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...

  3. &lpar;转&rpar;再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题)

    再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题) XML文档操作集锦(C#篇) webapi文档描述-swagger

  4. 基于 Annotation 拦截的 Spring AOP 权限验证方法

    基于 Annotation 拦截的 Spring AOP 权限验证方法 转自:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilte ...

  5. 再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题)

    在使用DataRow读取数据时,通常会遇到数据可能为Null, 但是又需要转换为如int等其它类型的数据,因此就通常会写这样的代码: if (dr[name] != DBNull.Value &amp ...

  6. 【FBA】SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

    //http://www.cnblogs.com/OceanEyes/p/custom-provider-in-sharepoint-2013-fba-authentication.html 由于项目 ...

  7. &lbrack;FBA&rsqb;SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

    //http://tech.ddvip.com/2014-05/1401197453210723.html 由于项目的需要,登录SharePoint Application的用户将从一个统一平台中获取 ...

  8. SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

    由于项目的需要,登录SharePoint Application的用户将从一个统一平台中获取,而不是从Domain中获取,所以需要对SharePoint Application的身份验证(Claims ...

  9. AIOps探索:基于VAE模型的周期性KPI异常检测方法——VAE异常检测

    AIOps探索:基于VAE模型的周期性KPI异常检测方法 from:jinjinlin.com   作者:林锦进 前言 在智能运维领域中,由于缺少异常样本,有监督方法的使用场景受限.因此,如何利用无监 ...

随机推荐

  1. redis3&period;0常用命令

    1.服务器启动 1)快捷启动 $redis-server 2)指定配置文件启动 $redis-server redis.conf 2.客服端启动 1)快捷无密码启动 $redis-cli 2)有密码和 ...

  2. jquery完整弹窗代码

    </html> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  3. HTML、CSS、JavaScript和PHP的注释

  4. 错误处理php

    一 HP关闭脚本错误提示的方法: 打开PHP安装目录下的php.ini文件 找到display_errors = On 修改为 display_errors = off 注意:如果你已经把PHP.in ...

  5. Objective-C:属性(&commat;property)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  6. ubuntu 搭建python2&period;x 抓取环境

    1.apt-get install python-bs4 bs4只有py2的代码,安装在py3下会很麻烦 bs4支持HTML parser,也可以支持第三方的分析器 2.apt-get install ...

  7. php面试题汇总四&lpar;基础篇附答案&rpar;

    1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION 与 COOKIE的区别是什么,请从 ...

  8. centos7&period;4安装redis

    参考连接 https://blog.csdn.net/qq_19399235/article/details/78313633/

  9. NOIP2011Mayan游戏&lpar;模拟)

    Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个77 行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指 ...

  10. cmd 安装mysql

    838444958 http://www.runoob.com/mysql/mysql-install.html  (cmd)Aa410766383    mysql  password bin目录下 ...