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

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


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

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

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

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




Спасибо:


KAX

Фотография
Дата: 07.03.2011
Ответить


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

Спасибо:

Alexander

Фотография
Дата: 07.03.2011
Ответить


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
    }
}

[cool]

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

Спасибо:

Alexander

Фотография
Дата: 11.03.2011
Ответить


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

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy