Exemplo n.º 1
0
        /// <summary>
        /// 各プロパティをデフォルト値に初期化します。
        /// </summary>
        public void Reset()
        {
            var propertyDic = MethodUtil.GetPropertyDic(GetType());

            if (propertyDic == null)
            {
                return;
            }

            var list =
                from propObj in propertyDic.Values
                let prop = propObj.PropertyInfo
                           where prop.DeclaringType != typeof(AppSettingsBase)
                           where propObj.CanWrite

                           // シリアライズの制御属性を調べます。
                           let attrs1 = prop.GetCustomAttributes(
                    typeof(NonSerializedAttribute), false)
                                        where !attrs1.Any()
                                        let attrs2 = prop.GetCustomAttributes(
                    typeof(IgnoreSerializedAttribute), false)
                                                     where !attrs2.Any()

                                                     // デフォルト値を属性から設定します。
                                                     let attrs3 = prop.GetCustomAttributes(
                    typeof(DefaultValueAttribute), false)
                                                                  let valAttr                         = attrs3.FirstOrDefault() as DefaultValueAttribute
                                                                                            let value = (valAttr != null ? valAttr.Value : null)
                                                                                                        select new { propObj, value };

            list.ForEach(_ => ResetProperty(_.propObj, _.value));
        }
Exemplo n.º 2
0
        /// <summary>
        /// シリアライズします。
        /// </summary>
        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            var propertyDic = MethodUtil.GetPropertyDic(GetType());

            foreach (var propertyObj in propertyDic.Values)
            {
                var property = propertyObj.PropertyInfo;
                if (!property.CanRead || !property.CanWrite)
                {
                    continue;
                }
                if (typeof(AppSettingsBase).Equals(property.DeclaringType))
                {
                    continue;
                }

                // ターゲットとなるプロパティの値を取得します。
                object value;
                if (!this.propertyStorage.TryGetValue(property.Name, out value))
                {
                    continue;
                }

                var valueType = (value == null
                    ? property.PropertyType
                    : value.GetType());

                // 単純型は値をそのまま書き出します。
                writer.WriteStartElement(SETTING_TAG);
                writer.WriteAttributeString(NAME_ATTRIBUTE, property.Name);

                // 文字列に変換できれば、それをそのまま出力します。
                string result;
                if (TryConvertToString(valueType, value, out result))
                {
                    writer.WriteAttributeString(SERIALIZEAS_ATTRIBUTE, "string");
                    writer.WriteElementString(VALUE_TAG, result);
                }
                else
                {
                    writer.WriteAttributeString(SERIALIZEAS_ATTRIBUTE, "xml");

                    writer.WriteStartElement(VALUE_TAG);
                    WriteXmlValue(writer, property.Name, valueType, value);
                    writer.WriteEndElement();
                }

                writer.WriteEndElement();
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// デシリアライズします。
        /// </summary>
        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            var propertyDic = MethodUtil.GetPropertyDic(GetType());

            reader.ReadStartElement();
            while (!reader.EOF)
            {
                // settingタグの開始ノードまで移動します。
                if (!reader.IsStartElement() ||
                    reader.LocalName != SETTING_TAG)
                {
                    if (!reader.ReadToFollowing(SETTING_TAG))
                    {
                        return;
                    }
                }

                // <Setting name="prop name" serialize-as="string or xml">
                var name        = reader.GetAttribute(NAME_ATTRIBUTE);
                var serializeAs = reader.GetAttribute(SERIALIZEAS_ATTRIBUTE);
                if (string.IsNullOrEmpty(name) ||
                    string.IsNullOrEmpty(serializeAs))
                {
                    reader.Read();
                    continue;
                }
                reader.ReadStartElement(SETTING_TAG);

                // プロパティから名前を検索します。
                IPropertyObject propertyObj;
                if (!propertyDic.TryGetValue(name, out propertyObj))
                {
                    continue;
                }

                // 種別によって読み込み方を変えます。
                if (serializeAs == "string")
                {
                    ReadStringValue(reader, propertyObj);
                }
                else
                {
                    ReadXmlValue(reader, propertyObj);
                }

                reader.ReadEndElement();
            }

            reader.ReadEndElement();
        }