/// <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); }