private void AppendSettingProperties(XElement parent, PropertyInfo[] settingProperties) { foreach (PropertyInfo info in settingProperties) { SettingAttribute settingAttribute = (SettingAttribute)info.GetCustomAttributes(typeof(SettingAttribute), true).First(); object value = info.GetValue(this.ModOptions, null); if (settingAttribute.Serializer == null) { XElement element; if (info.PropertyType.IsPrimitive) { element = new XElement(info.Name, new XAttribute("Value", value.ToString())); } else { if (!TrySerializeIntegratedType(info.PropertyType, value, out element)) { element = new XElement(info.Name); element.Value = value.ToString(); } } parent.Add(element); } else { Type serializerType = settingAttribute.Serializer; if (settingAttribute.Serializer.IsGenericType) { serializerType = settingAttribute.Serializer.MakeGenericType(info.PropertyType, typeof(XElement)); } MethodInfo serializeMethod = serializerType.GetMethod("Serialize"); object serializer = Activator.CreateInstance(serializerType); object result = serializeMethod.Invoke(serializer, new object[] { this, value }); XElement element; if (result is XElement) { element = (XElement)result; element.Name = info.Name; } else { element = new XElement(info.Name, new XAttribute("Serializer", "None")); element.Value = result.ToString(); } parent.Add(element); } } }
private void LoadSettingFields(XElement root, FieldInfo[] settingFields) { foreach (FieldInfo info in settingFields) { XElement element = root.Element(info.Name); if (element == null) { continue; } SettingAttribute settingAttribute = (SettingAttribute)info.GetCustomAttributes(typeof(SettingAttribute), true).First(); if (settingAttribute.Serializer == null) { object loadedValue; if (info.FieldType.IsPrimitive) { XAttribute valueAttribute = element.Attribute("Value"); if (valueAttribute == null) { continue; } loadedValue = Convert.ChangeType(valueAttribute.Value, info.FieldType); } else { if (!TryDeserializeIntegratedType(info.FieldType, element, out loadedValue)) { continue; } } info.SetValue(this.ModOptions, loadedValue); } else { Type serializerType = settingAttribute.Serializer; if (settingAttribute.Serializer.IsGenericType) { serializerType = settingAttribute.Serializer.MakeGenericType(info.FieldType, typeof(XElement)); } MethodInfo deserializeMethod = serializerType.GetMethod("Deserialize"); object serializer = Activator.CreateInstance(serializerType); object loadedValue; if (element.Attribute("Serializer") != null && element.Attribute("Serializer").Value == "None") { loadedValue = deserializeMethod.Invoke(serializer, new object[] { this, element.Value }); } else { loadedValue = deserializeMethod.Invoke(serializer, new object[] { this, element }); } info.SetValue(this.ModOptions, loadedValue); } } }