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


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

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

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

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



Спасибо:


KAX

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


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

Alexander

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


KAX Перейти
Если я Вас правильно понял, то можете использовать файлы конфигурации.
http://msdn.microsoft.co...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