Inheritance: System.ComponentModel.TypeConverter
        /// <summary>
        /// Gets a string from an instance of <c>T</c>.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value">The value.</param>
        /// <returns>
        /// <c>T</c> as a string.
        /// </returns>
        /// <remarks>
        /// If you are using a custom or special type, you should make sure that
        /// there is a <see cref="TypeConverter"/> registered for it.
        /// </remarks>
        internal static string GetStringFromT <T>(T value)
        {
            if (ReferenceEquals(value, default(T)))
            {
                return(string.Empty);
            }

            Type typeOfT = typeof(T);

            string stringValue;

            TypeConverter converter = TypeDescriptor.GetConverter(typeOfT);

            // verify that we can eventually round-trip the object.
            if (converter.CanConvertTo(StringType) && converter.CanConvertFrom(StringType))
            {
                stringValue = converter.ConvertTo(value, StringType) as string;
            }
            else
            {
                if (IsStringArray <T>())
                {
                    var stringArrayConverter = new StringArrayConverter();
                    stringValue = stringArrayConverter.ConvertTo(value, StringType) as string;
                }
                else if (IsByteArray <T>())
                {
                    var stringArrayConverter = new ByteArrayConverter();
                    stringValue = stringArrayConverter.ConvertTo(value, StringType) as string;
                }
                else
                {
                    TypeConverter stringConverter = TypeDescriptor.GetConverter(StringType);
                    if (stringConverter.CanConvertTo(typeOfT) && stringConverter.CanConvertFrom(typeOfT))
                    {
                        stringValue = stringConverter.ConvertTo(value, StringType) as string;
                    }
                    else
                    {
                        if (typeOfT == typeof(object))
                        {
                            stringValue = value.ToString();
                        }
                        else
                        {
                            string message = string.Format(Text.Culture, Text.CannotRoundTripType0, value.GetType());
                            throw new InvalidOperationException(message);
                        }
                    }
                }
            }
            return(stringValue);
        }
        /// <summary>
        /// Gets an instance of T from string.
        /// </summary>
        /// <typeparam name="T">
        /// </typeparam>
        /// <param name="value">The value to convert.</param>
        /// <returns>
        /// <paramref name="value"/> as an instance of <c>T</c> or an exception if
        /// the conversion is not possible.
        /// </returns>
        internal static T GetTFromString <T>(string value)
        {
            Type typeOfT = typeof(T);

            try
            {
                if (IsBool <T>())
                {
                    // Need to use aliasing to get around this.
                    return(ConvertToBool <T>(value));
                }

                if (IsStringArray <T>())
                {
                    var stringArrayConverter = new StringArrayConverter();
                    return((T)stringArrayConverter.ConvertFrom(value));
                }

                if (IsByteArray <T>())
                {
                    var byteArrayConverter = new ByteArrayConverter();
                    return((T)byteArrayConverter.ConvertFrom(value));
                }

                TypeConverter converter = TypeDescriptor.GetConverter(typeOfT);
                if (converter.CanConvertFrom(StringType))
                {
                    return((T)converter.ConvertFrom(value));
                }

                throw new InvalidOperationException(string.Format(Text.Culture, Text.NoTypeConverterForRestore0,
                                                                  typeOfT.Name));
            }
            catch (Exception ex)
            {
                string message = string.Format(Text.Culture, Text.FailedToConvert0T1, value, typeOfT.Name);
                throw new Exception(message, ex);
            }
        }