/* INFINITY CODE 2013-2019 */ /* http://www.infinity-code.com */ using System; using System.Globalization; using System.Reflection; using System.Xml; using UnityEngine; namespace InfinityCode.RealWorldTerrain { public static class RealWorldTerrainXMLExt { public static T GetAttribute(XmlNode node, string name) { XmlAttribute attribute = node.Attributes[name]; if (attribute == null) return default(T); string value = attribute.Value; if (string.IsNullOrEmpty(value)) return default(T); Type type = typeof(T); if (type == typeof(string)) return (T)Convert.ChangeType(value, type); T obj = default(T); PropertyInfo[] properties = type.GetProperties(); Type underlyingType = type; #if !UNITY_WSA if (properties.Length == 2 && string.Equals(properties[0].Name, "HasValue", StringComparison.InvariantCultureIgnoreCase)) underlyingType = properties[1].PropertyType; #else if (properties.Length == 2 && string.Equals(properties[0].Name, "HasValue", StringComparison.OrdinalIgnoreCase)) underlyingType = properties[1].PropertyType; #endif try { MethodInfo method = underlyingType.GetMethod("Parse", new[] { typeof(string), typeof(IFormatProvider) }); if (method != null) obj = (T)method.Invoke(null, new object[] { value, RealWorldTerrainCultureInfo.numberFormat }); else { 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; } } }