← Zurück

Сохранение параметров стратегии

У всех множество стратегий и у каждой стратегии обычно есть параметры.

Кто как создаёт структуру этих параметров в коде на C#?

Как классы, наследующие один и тот же интерфейс? Или как dictionary<string, object> - сопоставление имени параметра на значение?

Есть ли в C# более удобные классы для сохранения параметров?

War dieses Thema hilfreich?

Thema teilen

Kommentare (3)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

KAX
KAX

Если я Вас правильно понял, то можете использовать файлы конфигурации. http://msdn.microsoft.com/en-us/library/a65txexh.aspx

Alexander
Alexander Autor

KAX: Если я Вас правильно понял, то можете использовать файлы конфигурации. http://msdn.microsoft.com/en-us/library/a65txexh.aspx

Нет, немного не так. Речь именно о хранении внутри робота. В роботе много стратегий может быть и хорошо уметь с ними работать как с одним типом данных - чтобы обращаться, сериализовать, ....

2 варианта, которые я видел:

  1. Хранить настройки стратегий в виде Dictionary<string, object>
  2. Наследоваться от интерфейса и хранить настройки в классах.

Я выбрал первый вариант как наиболее простой и понятный. Есть только 1 проблема - Dictionary<string, object> не является сериализуемым.

Но и эта проблема, после поисков в инете, легко решилась. Кому необходимо - используйте SerializableDictionary:

using System;
using System.Runtime.Serialization;
using System.Xml;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace Robots.Entities
{
    [Serializable]
    [XmlRoot("dictionary")]
    public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
    {
        public SerializableDictionary() { }
        protected SerializableDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { }

        #region IXmlSerializable Members
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(XmlReader reader)
        {
            var keySerializer = new XmlSerializer(typeof(TKey));
            var valueSerializer = new XmlSerializer(typeof(TValue));

            var wasEmpty = reader.IsEmptyElement;
            reader.Read();
            if (wasEmpty) return;

            while (reader.NodeType != XmlNodeType.EndElement)
            {
                reader.ReadStartElement("item");

                reader.ReadStartElement("key");
                var key = (TKey)keySerializer.Deserialize(reader);
                reader.ReadEndElement();

                reader.ReadStartElement("value");
                var value = (TValue)valueSerializer.Deserialize(reader);
                reader.ReadEndElement();

                Add(key, value);

                reader.ReadEndElement();
                reader.MoveToContent();
            }

            reader.ReadEndElement();
        }

        public void WriteXml(XmlWriter writer)
        {
            var keySerializer = new XmlSerializer(typeof(TKey));
            var valueSerializer = new XmlSerializer(typeof(TValue));

            foreach (var key in Keys)
            {
                writer.WriteStartElement("item");

                writer.WriteStartElement("key");
                keySerializer.Serialize(writer, key);
                writer.WriteEndElement();

                writer.WriteStartElement("value");
                var value = this[key];
                valueSerializer.Serialize(writer, value);

                writer.WriteEndElement();
                writer.WriteEndElement();
            }
        }
        #endregion
    }
}

😎

А вот уже все настройки действительно сохраняются легко в AppConfig.

Alexander
Alexander Autor

В предыдущем сообщении отредактировал код класса SerializableDictionary чтобы не ругался FxCop. Кто воспользовался - можете тоже заменить :)