/// <summary><para>Die generische Methode konvertiert den generischen Typ T in das aktuelle <see cref="GaussKrueger"/> Objekt.</para></summary>
        ///
        /// <example>Das Beispiel konvertiert ein bestehendes <see cref="Geographic "/> Objekt in das aktuelle
        /// <see cref="GaussKrueger"/> Objekt mit Hilfe der generischen Methode <see cref="ConvertFrom{T}(T)">ConvertFrom&lt;T&gt;(T)</see>:
        /// <code>
        /// using GeoUtility.GeoSystem;
        /// Geographic geo = new Geographic(8.12345, 50.56789);
        /// GaussKrueger gauss;
        /// gauss.ConvertFrom&lt;Geographic&gt;(geo);
        /// </code>
        /// </example>
        ///
        /// <typeparam name="T">Ein aus der Basisklasse <see cref="GeoUtility.GeoSystem.Base.BaseSystem"/> abgeleiteter Typ.</typeparam>
        /// <param name="t">Das zu konvertierende Objekt als generischer Parameter.</param>
        public void ConvertFrom <T>(T t) where T : BaseSystem
        {
            GaussKrueger gauss = null;

            try
            {
                if (typeof(T) == typeof(UTM))
                {
                    gauss = (GaussKrueger)(UTM)(BaseSystem)t;
                }
                else if (typeof(T) == typeof(Geographic))
                {
                    gauss = (GaussKrueger)(Geographic)(BaseSystem)t;
                }
                else if (typeof(T) == typeof(MGRS))
                {
                    gauss = (GaussKrueger)(MGRS)(BaseSystem)t;
                }
                else if (typeof(T) == typeof(MapService))
                {
                    gauss = (GaussKrueger)(MapService)(BaseSystem)t;
                }
                if (gauss != null)
                {
                    this.East  = gauss.East;
                    this.North = gauss.North;
                    gauss      = null;
                }
            }
            catch (System.Exception ex)
            {
                throw new ErrorProvider.GeoException(new ErrorProvider.ErrorMessage("ERROR_CONVERTFROM"), ex);
            }
        }
        /// <summary>Die Funktion wird aus performancegründen implementiert.</summary>
        /// <param name="obj">Ein beliebiges Objekt.</param>
        /// <returns>Das übergebene Objekt ist gleich oder nicht.</returns>
        public override bool Equals(Object obj)
        {
            if (obj == null || GetType() != obj.GetType())
            {
                return(false);
            }
            GaussKrueger gauss = (GaussKrueger)obj;

            return((this.East == gauss.East) && (this.North == gauss.North));
        }
        /// <summary><para>Die statische Methode kann dazu verwendet werden, als String-Werte übergebene Rechts- und Hochwert-Parameter
        /// auf ihre Gültigkeit zu überprüfen. Die Methode gibt eine Liste gültiger Parameter, eine Fehlermeldung und
        /// ein <see cref="GaussKrueger"/>-Objekt zurück. Ist einer der Parameter ungültig, wird ein <see cref="GaussKrueger"/>-Objekt
        /// mir dem Wert null zurückgegeben.</para></summary>
        /// <param name="Rechts">Längengrad-Wert als Typ <see cref="System.String"/>.</param>
        /// <param name="Hoch">Breitengrad-Wert als Typ <see cref="System.String"/>.</param>
        /// <param name="Gauss">Ein gültiges <see cref="GaussKrueger"/>-Objekt oder null.</param>
        /// <param name="ErrorMessage">Eine ausführliche Fehlermeldung, falls ein Fehler aufgetreten ist.</param>
        /// <param name="ValidItems">Ein <see cref="System.Collections.Generic.Dictionary{T, T}"/>-Objekt, in dem die gültigen und ungültigen Parameter aufgeführt werden.</param>
        /// <returns>True, wenn alle Parameter gültig sind, sonst False.</returns>
        public static bool TryParse(string Rechts, string Hoch, out GaussKrueger Gauss, out string ErrorMessage, out Dictionary <string, bool> ValidItems)
        {
            bool                      result    = true;
            bool                      converted = true;
            StringBuilder             sb        = new StringBuilder();
            GaussKrueger              gauss     = null;
            Dictionary <string, bool> list      = new Dictionary <string, bool>();
            double                    rechts    = 0.0;
            double                    hoch      = 0.0;

            Rechts = Rechts.Replace('.', ',');
            Hoch   = Hoch.Replace('.', ',');

            try { rechts = double.Parse(Rechts); } catch { converted = false; }
            if ((rechts < 2422500.0) || (rechts > 5570000.0))
            {
                converted = false;
            }
            list.Add("East", converted);
            if (list["East"] == false)
            {
                sb.Append(new ErrorProvider.ErrorMessage("ERROR_GAUSS_EAST").Text + "\r\n");
                result = false;
            }
            converted = true;

            try { hoch = double.Parse(Hoch); } catch { converted = false; }
            if ((hoch < 5100000.0) || (hoch > 6200000.0))
            {
                converted = false;
            }
            list.Add("North", converted);
            if (list["North"] == false)
            {
                sb.Append(new ErrorProvider.ErrorMessage("ERROR_GAUSS_NORTH").Text + "\r\n");
                result = false;
            }

            if (result == true)
            {
                gauss = new GaussKrueger(rechts, hoch);
                try
                {
                    Geographic geo = (Geographic)gauss;
                    if ((geo.Longitude < 5.0) || (geo.Longitude > 16.0))
                    {
                        sb.Append(new ErrorProvider.ErrorMessage("ERROR_GAUSS_EAST").Text + "\r\n");
                        list["East"] = false;
                        result       = false;
                    }
                    if ((geo.Latitude < 46.0) || (geo.Latitude > 56.0))
                    {
                        sb.Append(new ErrorProvider.ErrorMessage("ERROR_GAUSS_NORTH").Text + "\r\n");
                        list["North"] = false;
                        result        = false;
                    }
                }
                catch
                {
                    gauss  = null;
                    result = false;
                    sb.Append(new ErrorProvider.ErrorMessage("ERROR_GK_OUT_OF_RANGE").Text + "\r\n");
                }
            }

            Gauss        = gauss;
            ErrorMessage = sb.ToString();
            ValidItems   = list;
            return(result);
        }