1. 程式人生 > >C#將資料轉換為指定型別,支援對可空型別(Nullable類)轉換方法示例

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