using System; using System.Collections.Generic; using System.Reflection; using System.ComponentModel; using System.Linq; using System.Xml; namespace RobloxFiles.XmlFormat { public static class XmlPropertyTokens { public static IReadOnlyDictionary Handlers; static XmlPropertyTokens() { // Initialize the PropertyToken handler singletons. Type IXmlPropertyToken = typeof(IXmlPropertyToken); var assembly = Assembly.GetExecutingAssembly(); var handlerTypes = assembly.GetTypes() .Where(type => IXmlPropertyToken.IsAssignableFrom(type)) .Where(type => type != IXmlPropertyToken); var propTokens = handlerTypes .Select(handlerType => Activator.CreateInstance(handlerType)) .Cast(); var tokenHandlers = new Dictionary(); foreach (IXmlPropertyToken propToken in propTokens) { var tokens = propToken.Token.Split(';') .Select(token => token.Trim()) .ToList(); tokens.ForEach(token => tokenHandlers.Add(token, propToken)); } Handlers = tokenHandlers; } public static bool ReadPropertyGeneric(XmlNode token, out T outValue) where T : struct { try { string value = token.InnerText; Type type = typeof(T); object result = null; if (type == typeof(int)) result = Formatting.ParseInt(value); else if (type == typeof(float)) result = Formatting.ParseFloat(value); else if (type == typeof(double)) result = Formatting.ParseDouble(value); if (result == null) { Type resultType = typeof(T); var converter = TypeDescriptor.GetConverter(resultType); result = converter.ConvertFromString(token.InnerText); } outValue = (T)result; return true; } catch { outValue = default(T); return false; } } public static bool ReadPropertyGeneric(Property prop, PropertyType propType, XmlNode token) where T : struct { T result; if (ReadPropertyGeneric(token, out result)) { prop.Type = propType; prop.Value = result; return true; } return false; } public static IXmlPropertyToken GetHandler(string tokenName) { IXmlPropertyToken result = null; if (Handlers.ContainsKey(tokenName)) result = Handlers[tokenName]; return result; } public static T GetHandler() where T : IXmlPropertyToken { IXmlPropertyToken result = Handlers.Values .Where(token => token is T) .First(); return (T)result; } } }