public static bool CanConvertType(Type initialType, Type targetType, bool allowTypeNameToString)
        {
            ValidationUtils.ArgumentNotNull(initialType, "initialType");
            ValidationUtils.ArgumentNotNull(targetType, "targetType");
            if (ReflectionUtils.IsNullableType(targetType))
            {
                targetType = Nullable.GetUnderlyingType(targetType);
            }
            if (targetType == initialType)
            {
                return(true);
            }
            if (typeof(IConvertible).IsAssignableFrom(initialType) && typeof(IConvertible).IsAssignableFrom(targetType))
            {
                return(true);
            }
            if (initialType == typeof(DateTime) && targetType == typeof(DateTimeOffset))
            {
                return(true);
            }
            if (initialType == typeof(Guid) && (targetType == typeof(Guid) || targetType == typeof(string)))
            {
                return(true);
            }
            if (initialType == typeof(Type) && targetType == typeof(string))
            {
                return(true);
            }
            TypeConverter converter = ConvertUtils.GetConverter(initialType);

            if (converter != null && !ConvertUtils.IsComponentConverter(converter) && converter.CanConvertTo(targetType) && (allowTypeNameToString || converter.GetType() != typeof(TypeConverter)))
            {
                return(true);
            }
            TypeConverter typeConverter = ConvertUtils.GetConverter(targetType);

            if (typeConverter != null && !ConvertUtils.IsComponentConverter(typeConverter) && typeConverter.CanConvertFrom(initialType))
            {
                return(true);
            }
            if (initialType == typeof(DBNull) && ReflectionUtils.IsNullable(targetType))
            {
                return(true);
            }
            return(false);
        }