將基於Nullable的類型轉換實如今擴展方法中

3、將基於Nullable<T>的類型轉換實如今擴展方法中

從上面的介紹咱們能夠得出這樣的結論:若是類型T1和T2可以相互兼容,咱們能夠藉助Convert將T1類型對象轉換成T2類型,而後經過顯式類型轉換進一步轉換成Nullable<T2>。咱們能夠經過這兩個步驟實現針對於Nullable<T>類型的轉換。爲了操做方便,我將此轉換邏輯寫在針對IConvertible接口的擴展方法中:app

   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:     }
  11: }

藉助於上面這個擴展方法ConvertTo,對於目標類型爲Nullable<T>的轉換就顯得很簡單了:this

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

 

4、進一步完善擴展方法ConvertTo

上面定義的擴展方法只能完成針對目標類型爲Nullable<T>的轉換。如今咱們來進一步完善它,讓這個方法能夠實現任意類型之間的轉換。下面是咱們新版本的ConvertTo方法的定義:spa

   1: public static T ConvertTo<T>(this IConvertible convertibleValue)
   2: {
   3:     if (null == convertibleValue)
   4:     {
   5:         return default(T);
   6:     }
   7:  
   8:     if (!typeof(T).IsGenericType)
   9:     {
  10:         return (T)Convert.ChangeType(convertibleValue, typeof(T));
  11:     }
  12:     else
  13:     {
  14:         Type genericTypeDefinition = typeof(T).GetGenericTypeDefinition();
  15:         if (genericTypeDefinition == typeof(Nullable<>))
  16:         {
  17:             return (T)Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(typeof(T)));
  18:         }
  19:     }
  20:     throw new InvalidCastException(string.Format("Invalid cast from type \"{0}\" to type \"{1}\".", convertibleValue.GetType().FullName, typeof(T).FullName));
相關文章
相關標籤/搜索