Пример #1
0
        /// <summary>
        /// Overrides the ConvertFrom method of IConvertFrom.
        /// </summary>
        /// <param name="source">the object to convert to an IPAddress</param>
        /// <returns>the IPAddress</returns>
        /// <remarks>
        /// <para>
        /// Uses the <see cref="IPAddress.Parse"/> method to convert the
        /// <see cref="String"/> argument to an <see cref="IPAddress"/>.
        /// If that fails then the string is resolved as a DNS hostname.
        /// </para>
        /// </remarks>
        /// <exception cref="ConversionNotSupportedException">
        /// The <paramref name="source"/> object cannot be converted to the
        /// target type. To check for this condition use the <see cref="CanConvertFrom"/>
        /// method.
        /// </exception>
        public object ConvertFrom(object source)
        {
            string str = source as string;

            if (str != null && str.Length > 0)
            {
                try
                {
#if NET_2_0 || NETCF_2_0
#if !NETCF_2_0
                    // Try an explicit parse of string representation of an IPAddress (v4 or v6)
                    IPAddress result;
                    if (IPAddress.TryParse(str, out result))
                    {
                        return(result);
                    }
#endif

                    // Try to resolve via DNS. This is a blocking call.
                    // GetHostEntry works with either an IPAddress string or a host name
                    IPHostEntry host = Dns.GetHostEntry(str);
                    if (host != null &&
                        host.AddressList != null &&
                        host.AddressList.Length > 0 &&
                        host.AddressList[0] != null)
                    {
                        return(host.AddressList[0]);
                    }
#else
                    // Before .NET 2 we need to try to parse the IPAddress from the string first

                    // Check if the string only contains IP address valid chars
                    if (str.Trim(validIpAddressChars).Length == 0)
                    {
                        try
                        {
                            // try to parse the string as an IP address
                            return(IPAddress.Parse(str));
                        }
                        catch (FormatException)
                        {
                            // Ignore a FormatException, try to resolve via DNS
                        }
                    }

                    // Try to resolve via DNS. This is a blocking call.
                    IPHostEntry host = Dns.GetHostByName(str);
                    if (host != null &&
                        host.AddressList != null &&
                        host.AddressList.Length > 0 &&
                        host.AddressList[0] != null)
                    {
                        return(host.AddressList[0]);
                    }
#endif
                }
                catch (Exception ex)
                {
                    throw ConversionNotSupportedException.Create(typeof(IPAddress), source, ex);
                }
            }
            throw ConversionNotSupportedException.Create(typeof(IPAddress), source);
        }