谈谈Nullable的类型转换问题

发表于:2012-2-21 10:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Artech(cnblogs)    来源:51Testing软件测试网采编

分享:

  三、将基于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. if (!typeof(T).IsGenericType)   
  8. {   
  9. return (T)Convert.ChangeType(convertibleValue, typeof(T));   
  10. }   
  11. else   
  12. {   
  13. Type genericTypeDefinition = typeof(T).GetGenericTypeDefinition();   
  14. if (genericTypeDefinition == typeof(Nullable<>))   
  15. {   
  16. return (T)Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(typeof(T)));   
  17. }   
  18. }   
  19. throw new InvalidCastException(string.Format("Invalid cast from type \"{0}\" to type \"{1}\".", convertibleValue.GetType().FullName, typeof(T).FullName));   
  20. }

  在上面的方法中,我们首先需要确定目标类型是否是Nullable<T>,这个可以通过调用Type对象的GetGenericTypeDefinition方法来判断。如果是,则先要将其转换成对应的基本类型(Nullable<T>的泛型类型)。我们可以通过调用静态类Nullable的静态方法GetUnderlyingType来获得这个基本类型(Underlying Type)。有了这个完善版本的ConvertTo扩展方法,我们就可以进行任意的类型转化了——不论目标类型是可空值类型,还是非可空值类型:

  1. int intValue1 = "123".ConvertTo<int>();   
  2. int? intValue2 = "123".ConvertTo<int?>();   
  3. DateTime dateTimeValue1 = "1981-08-24".ConvertTo<DateTime>();   
  4. DateTime? dateTimeValue2 = "1981-08-24".ConvertTo<DateTime?>();

  五、谈谈NullableConverter

  上面谈到TypeConverter这个类型,并且说到它具有一系列针对具体数据类型的子类。其中一个子类就是NullableConverter,故名思义,这个TypeConverter专门用于Nullable<T>的类型转换。使用该类实现针对可空值类型的转换很方便,比如:

  1. string literalValue = "1981-08-24";   
  2. NullableConverter converter = new NullableConverter(typeof(DateTime?));   
  3. DateTime? dateTimevalue = (DateTime?)converter.ConvertFromString(literalValue);

22/2<12
100家互联网大公司java笔试题汇总,填问卷领取~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号