C#將數據轉換爲指定類型,支持對可空類型(Nullable類)轉換方法示例

我們知道在C#中,引用類型可以爲null,而值類型不可以爲null,就是值類型必須要有值。msdn上面的解釋是值類型沒有足夠的空量來表示空值,它的容量只夠表示適合該類型的值,沒有多餘的容量。而數據庫中(比如sqlserver)中,任何類型的值都是可以爲null的,這就給我們在往數據庫中插入值帶來麻煩了,比如要往數據庫中的int字段中插入一個null值,而C#在2.0之前,是不可能給一個int類型的變量賦於null的。

爲了解決這個問題,C#引入了Nullable類,該類爲值類型賦於null值提供了支持,如果我們要爲一個int類型賦於null值,那麼我們就可以聲明該類型爲Nullable<int >,也可以直接縮寫爲int?,這就是我們在C#2.0後版本中看到的大量可爲空的值類型聲明方式。

基礎基元類型的概念:
可空類型的原類型稱之爲該類型的基礎基元類型,比如我們聲明瞭變量int?,那麼我們就稱int爲int?的基礎基元類型。

明白了這些概念後,現在假設我們要寫一個方法,該方法要支持將一個object類型的值轉換爲任何可能轉換的類型。
該類有兩個參數,值value,類型convertsionType,
如果不支持可空類型,那麼該方法很好實現,如下:
public static object ChanageType(object value, Type 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 class PageBaseHelper
{
    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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章