public void TestToNullableDuration()
 {
     Assert.Null(TimeSpanConverter.ToNullableTimeSpan(null));
     Assert.True(TimeSpanConverter.ToNullableTimeSpan((int)6000).Value.Seconds == 6);
     Assert.True(TimeSpanConverter.ToNullableTimeSpan((short)6000).Value.Seconds == 6);
     Assert.True(TimeSpanConverter.ToNullableTimeSpan(6000.5).Value.Seconds == 6);
     //Assert.True(TimeSpanConverter.ToNullableTimeSpan(-600).Value.Seconds == -1);
     Assert.True(TimeSpanConverter.ToNullableTimeSpan(0).Value.Seconds == 0);
 }
        /// <summary>
        /// Converts value into an object type specified by Type Code
        /// or returns default value when conversion is not possible.
        /// </summary>
        /// <typeparam name="T">the Class type for the data type into which 'value' is to be converted.</typeparam>
        /// <param name="value">the value to convert.</param>
        /// <param name="defaultValue">the default value to return if conversion is not possible
        /// (returns null).</param>
        /// <returns>object value of type corresponding to TypeCode, or default value when
        /// conversion is not supported</returns>
        public static T ToTypeWithDefault <T>(object value, T defaultValue)
        {
            if (value == null)
            {
                return(defaultValue);
            }
            if (value is T)
            {
                return((T)value);
            }

            var typeInfo = typeof(T).GetTypeInfo();

            if (typeInfo.IsEnum)
            {
                value = EnumConverter.ToEnumWithDefault <T>(value, defaultValue);
            }
            else if (typeInfo.IsAssignableFrom(typeof(decimal)))
            {
                value = DecimalConverter.ToNullableDecimal(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(string)))
            {
                value = StringConverter.ToNullableString(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(long)))
            {
                value = LongConverter.ToNullableLong(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(int)))
            {
                value = IntegerConverter.ToNullableInteger(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(double)))
            {
                value = DoubleConverter.ToNullableDouble(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(float)))
            {
                value = FloatConverter.ToNullableFloat(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(bool)))
            {
                value = BooleanConverter.ToNullableBoolean(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(DateTime)))
            {
                value = DateTimeConverter.ToNullableDateTime(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(TimeSpan)))
            {
                value = TimeSpanConverter.ToNullableTimeSpan(value);
            }

            if (value == null)
            {
                return(defaultValue);
            }

            try
            {
                if (typeInfo.IsClass || typeInfo.IsInterface)
                {
                    return(value is T ? (T)value : defaultValue);
                }
                else
                {
                    return((T)value);
                }
            }
            catch
            {
                return(defaultValue);
            }
        }
        /// <summary>
        /// Converts value into an object type specified by Type Code or returns null
        /// when conversion is not possible.
        /// </summary>
        /// <typeparam name="T">the Class type for the data type.</typeparam>
        /// <param name="value">the value to convert.</param>
        /// <returns>object value of type corresponding to TypeCode, or null when
        /// conversion is not supported.</returns>
        /// See <see cref="TypeConverter.ToTypeCode(Type)"/>
        public static T?ToNullableType <T>(object value) where T : struct
        {
            if (value == null)
            {
                return(null);
            }
            if (value is T)
            {
                return((T)value);
            }

            var typeInfo = typeof(T).GetTypeInfo();

            if (typeInfo.IsEnum)
            {
                value = EnumConverter.ToNullableEnum <T>(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(decimal)))
            {
                value = DecimalConverter.ToNullableDecimal(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(string)))
            {
                value = StringConverter.ToNullableString(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(long)))
            {
                value = LongConverter.ToNullableLong(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(int)))
            {
                value = IntegerConverter.ToNullableInteger(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(double)))
            {
                value = DoubleConverter.ToNullableDouble(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(float)))
            {
                value = FloatConverter.ToNullableFloat(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(DateTime)))
            {
                value = DateTimeConverter.ToNullableDateTime(value);
            }
            else if (typeInfo.IsAssignableFrom(typeof(TimeSpan)))
            {
                value = TimeSpanConverter.ToNullableTimeSpan(value);
            }

            if (value == null)
            {
                return(null);
            }

            try
            {
                return((T)value);
            }
            catch
            {
                return(null);
            }
        }