示例#1
0
        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);
                }
            }
        }
示例#2
0
        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);
                }
            }
        }