Example #1
0
    /// <summary>
    /// Get the value of element as the specified type or default value if the child is not found.
    /// </summary>
    /// <typeparam name="T">Type of element</typeparam>
    /// <param name="el">Element</param>
    /// <param name="defaultValue">Default value</param>
    /// <returns>Value of element as the specified type or default value.</returns>
    public T Get <T>(XmlElement el, T defaultValue)
    {
        if (el == null)
        {
            return(defaultValue);
        }

        string value = el.InnerXml;

        if (string.IsNullOrEmpty(value))
        {
            return(defaultValue);
        }

        Type type = typeof(T);

        if (type == typeof(string))
        {
            return((T)Convert.ChangeType(value, type));
        }
        if (type == typeof(Vector2))
        {
            return((T)Convert.ChangeType(new Vector2(Get <float>(el["X"]), Get <float>(el["Y"])), type));
        }
        if (type == typeof(Vector3))
        {
            return((T)Convert.ChangeType(new Vector3(Get <float>(el["X"]), Get <float>(el["Y"]), Get <float>(el["Z"])), type));
        }
        if (type == typeof(Color) || type == typeof(Color32))
        {
            return((T)Convert.ChangeType(OnlineMapsUtils.HexToColor(value), type));
        }
        if (type == typeof(OnlineMapsRange))
        {
            return((T)Convert.ChangeType(new OnlineMapsRange(Get <int>("Min"), Get <int>("Max")), type));
        }

        T obj = defaultValue;

        PropertyInfo[] properties     = type.GetProperties();
        Type           underlyingType = type;

        if (properties.Length == 2 && string.Equals(properties[0].Name, "HasValue", StringComparison.InvariantCultureIgnoreCase))
        {
            underlyingType = properties[1].PropertyType;
        }

        try
        {
            MethodInfo method = underlyingType.GetMethod("Parse", new[] { typeof(string) });
            obj = (T)method.Invoke(null, new[] { value });
        }
        catch (Exception exception)
        {
            Debug.Log(exception.Message + "\n" + exception.StackTrace);
            throw;
        }

        return(obj);
    }