從上面的介紹咱們能夠得出這樣的結論:若是類型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>();
上面定義的擴展方法只能完成針對目標類型爲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));