日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
談?wù)凬ullable的類型轉(zhuǎn)換問題

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

十多年的東西湖網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整東西湖建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“東西湖網(wǎng)站設(shè)計(jì)”,“東西湖網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

一、四種典型的類型轉(zhuǎn)換方式

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

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

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

 
 
 
  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等。在使用的時(shí)候你需要先實(shí)例化相應(yīng)的TypeConverter,然后調(diào)用相應(yīng)的類型轉(zhuǎn)換方法。比如:

 
 
 
  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); 

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

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

 

二、當(dāng)類型轉(zhuǎn)換遭遇Nullable類型

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

 
 
 
  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);   

類型轉(zhuǎn)換錯(cuò)誤消息會(huì)被輸出:

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

實(shí)際上,如果你調(diào)用Convert的ChangeType方法將任何類型對(duì)象轉(zhuǎn)換成Nullable類型,都會(huì)拋出出InvalidCastException異常,即使你將T類型轉(zhuǎn)化成Nullable。比如,我們將上面的例子中原數(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);   

依然會(huì)輸入類似的錯(cuò)誤信息:

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

而實(shí)際上,T類型的對(duì)象是可以顯式或者隱式轉(zhuǎn)化成Nullable對(duì)象的。也就是說,下面代碼所表示的類型轉(zhuǎn)換是沒有問題的:

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

 

三、將基于Nullable的類型轉(zhuǎn)換實(shí)現(xiàn)在擴(kuò)展方法中

從上面的介紹我們可以得出這樣的結(jié)論:如果類型T1和T2能夠相互兼容,我們可以借助Convert將T1類型對(duì)象轉(zhuǎn)換成T2類型,然后通過顯式類型轉(zhuǎn)換進(jìn)一步轉(zhuǎn)換成Nullable。我們可以通過這兩個(gè)步驟實(shí)現(xiàn)針對(duì)于Nullable類型的轉(zhuǎn)換。為了操作方便,我將此轉(zhuǎn)換邏輯寫在針對(duì)IConvertible接口的擴(kuò)展方法中:

 
 
 
  1. public static class ConvertionExtensions   
  2. {   
  3. public static T? ConvertTo(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. }   

借助于上面這個(gè)擴(kuò)展方法ConvertTo,對(duì)于目標(biāo)類型為Nullable的轉(zhuǎn)換就顯得很簡(jiǎn)單了:

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

 

四、進(jìn)一步完善擴(kuò)展方法ConvertTo

上面定義的擴(kuò)展方法只能完成針對(duì)目標(biāo)類型為Nullable的轉(zhuǎn)換。現(xiàn)在我們來進(jìn)一步完善它,讓這個(gè)方法可以實(shí)現(xiàn)任意類型之間的轉(zhuǎn)換。下面是我們新版本的ConvertTo方法的定義:

 
 
 
  1. public static T ConvertTo(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));   

在上面的方法中,我們首先需要確定目標(biāo)類型是否是Nullable,這個(gè)可以通過調(diào)用Type對(duì)象的GetGenericTypeDefinition方法來判斷。如果是,則先要將其轉(zhuǎn)換成對(duì)應(yīng)的基本類型(Nullable的泛型類型)。我們可以通過調(diào)用靜態(tài)類Nullable的靜態(tài)方法GetUnderlyingType來獲得這個(gè)基本類型(Underlying Type)。有了這個(gè)完善版本的ConvertTo擴(kuò)展方法,我們就可以進(jìn)行任意的類型轉(zhuǎn)化了——不論目標(biāo)類型是可空值類型,還是非可空值類型:

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

 

五、談?wù)凬ullableConverter

上面談到TypeConverter這個(gè)類型,并且說到它具有一系列針對(duì)具體數(shù)據(jù)類型的子類。其中一個(gè)子類就是NullableConverter,故名思義,這個(gè)TypeConverter專門用于Nullable的類型轉(zhuǎn)換。使用該類實(shí)現(xiàn)針對(duì)可空值類型的轉(zhuǎn)換很方便,比如:

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

文章名稱:談?wù)凬ullable的類型轉(zhuǎn)換問題
當(dāng)前鏈接:http://www.5511xx.com/article/djsidjd.html