爲了解決這個問題,C#引入了Nullable類,該類爲值類型賦於null值提供了支持,如果我們要爲一個int類型賦於null值,那麼我們就可以聲明該類型爲Nullable<int >,也可以直接縮寫爲int?,這就是我們在C#2.0後版本中看到的大量可爲空的值類型聲明方式。
基礎基元類型的概念:
可空類型的原類型稱之爲該類型的基礎基元類型,比如我們聲明瞭變量int?,那麼我們就稱int爲int?的基礎基元類型。
明白了這些概念後,現在假設我們要寫一個方法,該方法要支持將一個object類型的值轉換爲任何可能轉換的類型。
該類有兩個參數,值value,類型convertsionType,
如果不支持可空類型,那麼該方法很好實現,如下:
{
return Convert.ChangeType(value, convertsionType);
}
但如果convertsionType爲可空類型,該方法就會報類似如下錯誤了:
從“System.String”到“System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”的強制轉換無效。
所以改寫方法如下:
{
public static object SD_ChanageType(this object value, Type convertsionType)
{
//判斷convertsionType類型是否爲泛型,因爲nullable是泛型類,
if (convertsionType.IsGenericType &&
//判斷convertsionType是否爲nullable泛型類
convertsionType.GetGenericTypeDefinition().Equals(typeof(Nullable< >)))
{
if (value == null || value.ToString().Length == 0)
{
return null;
}
//如果convertsionType爲nullable類,聲明一個NullableConverter類,該類提供從Nullable類到基礎基元類型的轉換
NullableConverter nullableConverter = new NullableConverter(convertsionType);
//將convertsionType轉換爲nullable對的基礎基元類型
convertsionType = nullableConverter.UnderlyingType;
}
return Convert.ChangeType(value, convertsionType);
}
}