自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

談談Nullable<T>的類型轉換問題

開發(fā) 后端
我們都知道,類型轉換就是把一種數(shù)據(jù)類型轉換成另一種數(shù)據(jù)類型。本文介紹的是Nullable<T>的類型轉換,讓我們一起來看。

本篇文章討論可空值類型(Nullable<T>)的轉換,卻確地說是如何將一種類型的值對象轉換成相應的可空值。這來源于今天我們的一個成員遇到的一個小問題,我經(jīng)過一些整理寫了這篇文章。雖然沒有什么技術含量可言,也希望對某些讀者帶來幫助。

一、四種典型的類型轉換方式

對于類型轉化,或者進一步地,對于像Int、Double、DateTime、String等這些原生類型之間的轉化,我們具有四種典型的轉換方式。如果類型之間不具有隱士轉換關系存儲,我們可以之間通過類型轉換操作符進行顯式轉換,比如:

  1. double doubleValue = 3.14159265;  
  2. int intValue = (int)doubleValue; 

第二種則是借助于Convert這個靜態(tài)類型的ChangeType或者ToXxx方法(Xxx代表轉換的目標類型),比如:

  1. string literalValue = "123";   
  2. int intValue1 = Convert.ToInt32(literalValue);   
  3. int intValue2 = (int)Convert.ChangeType(literalValue,typeof(int)); 

第三種方法為創(chuàng)建TypeConverter或者它的基于具體類型的若干子類,比如StringConverter、BooleanConverter、DateTimeConverter等。在使用的時候你需要先實例化相應的TypeConverter,然后調(diào)用相應的類型轉換方法。比如:

  1. string literalValue = "1981-08-24";   
  2. DateTimeConverter dateTypeConverter = newDateTimeConverter();   
  3. DateTime dateTimeValue = (DateTime)dateTypeConverter.ConvertFromString(literalValue);   
  4. literalValue = "02:40:50";   
  5. TimeSpanConverter timeSpanConverter = new imeSpanConverter();   
  6. TimeSpan timeSpanValue = (TimeSpan imeSpanConverter.ConvertFromString(literalValue); 

***一種常見的方法用在將基于某種具體類型的格式化字符串轉化成對應的類型,我們可以調(diào)用具體類型的靜態(tài)方法Parse或者TryParse實現(xiàn)類型的轉換,比如:

 

  1. string literalValue = "1981-08-24";  
  2. DateTime dateTimeValue1 = DateTime.Parse(literalValue);  DateTime dateTimeValue2;   
  3. if (DateTime.TryParse(literalValue, out dateTimeValue2))   
  4. {   
  5. //...   

 

二、當類型轉換遭遇Nullable<T>類型

Convert幾乎實現(xiàn)所有“兼容類型”之間的轉換,也可以向Parse方法一樣解析具有合法格式的字符串。但是,如果目標類型換成是Nullable<T>類型的時候,類型轉換將會失敗。比如我們將上面第二個例子的目標類型從int換成int?(Nullable<Int32>):

  1. string literalValue = "123";   
  2. try   
  3. {   
  4. int? intValue = (int?)Convert.ChangeType(literalValue,typeof(int?));   
  5. }   
  6. catch (InvalidCastException ex)   
  7. {   
  8. Console.WriteLine(ex.Message);   

類型轉換錯誤消息會被輸出:

  1. Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int32, mscorlib,   
  2. Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' 

實際上,如果你調(diào)用Convert的ChangeType方法將任何類型對象轉換成Nullable<T>類型,都會拋出出InvalidCastException異常,即使你將T類型轉化成Nullable<T>。比如,我們將上面的例子中原數(shù)據(jù)類型換成int類型:

  1. int intValue1 = 123;   
  2. try   
  3. {   
  4. int? intValue = (int?)Convert.ChangeType(intValue1,typeof(int?));   
  5. }   
  6. catch (InvalidCastException ex)   
  7. {   
  8. Console.WriteLine(ex.Message);   

依然會輸入類似的錯誤信息:

  1. Invalid cast from 'System.Int32' to 'System.Nullable`1[[System.Int32, mscorlib,   
  2. Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'. 

而實際上,T類型的對象是可以顯式或者隱式轉化成Nullable<T>對象的。也就是說,下面代碼所表示的類型轉換是沒有問題的:

 

  1. int intValue1 = 123;   
  2. int? intValue2 = intValue1;   
  3. int? intValue3 = (int?)intValue1; 

 

三、將基于Nullable<T>的類型轉換實現(xiàn)在擴展方法中

從上面的介紹我們可以得出這樣的結論:如果類型T1和T2能夠相互兼容,我們可以借助Convert將T1類型對象轉換成T2類型,然后通過顯式類型轉換進一步轉換成Nullable<T2>。我們可以通過這兩個步驟實現(xiàn)針對于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. }   

借助于上面這個擴展方法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>的轉換?,F(xiàn)在我們來進一步完善它,讓這個方法可以實現(xiàn)任意類型之間的轉換。下面是我們新版本的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));   

在上面的方法中,我們首先需要確定目標類型是否是Nullable<T>,這個可以通過調(diào)用Type對象的GetGenericTypeDefinition方法來判斷。如果是,則先要將其轉換成對應的基本類型(Nullable<T>的泛型類型)。我們可以通過調(diào)用靜態(tài)類Nullable的靜態(tài)方法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這個類型,并且說到它具有一系列針對具體數(shù)據(jù)類型的子類。其中一個子類就是NullableConverter,故名思義,這個TypeConverter專門用于Nullable<T>的類型轉換。使用該類實現(xiàn)針對可空值類型的轉換很方便,比如:

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

【編輯推薦】

  1. Oracle記錄類型轉換
  2. 1.3.10 轉換和強制類型轉換
  3. 揭開Java數(shù)據(jù)類型轉換神秘面紗
  4. 3.3 “一加一等于幾?”變量類型轉換
責任編輯:于鐵 來源: 博客園
相關推薦

2009-08-10 14:55:04

C#定義Nullabl

2012-06-29 13:45:53

XML

2013-03-19 09:33:46

項目

2021-04-20 08:31:13

Kubernetes局限性容器

2017-11-22 09:00:12

RAID類型磁盤

2024-12-09 12:00:00

Python編程數(shù)據(jù)類型轉換

2018-07-16 14:52:59

無線共存技術

2024-03-22 13:31:00

線程策略線程池

2023-06-26 00:03:55

Go語言類型

2023-01-17 14:01:19

JavaScript類型轉換字符串

2010-11-15 13:35:28

Oracle記錄類型

2024-08-09 13:39:27

2022-10-27 20:42:04

JavaScripJava編程語言

2022-08-16 09:03:01

JavaScript前端

2025-03-07 08:31:54

2010-03-12 14:10:19

以太網(wǎng)交換機

2016-11-03 13:00:54

類型轉換javascript

2009-12-24 14:18:57

WPF類型轉換

2024-01-03 13:39:00

JS,Javascrip算法

2021-04-22 07:41:46

JavaScript類型轉換
點贊
收藏

51CTO技術棧公眾號