Значения свойств по умолчанию с использованием Properties.Settings.Default
Вопрос
Я использую .Net 2 и обычный способ хранения настроек.Я храню свой собственный объект, сериализованный в XML.Я пытаюсь получить значение свойства по умолчанию (но без сброса других свойств).Я использую:
ValuationInput valuationInput = (ValuationInput) Settings.Default.Properties["ValuationInput"].DefaultValue;
Но, похоже, он возвращает строку вместо ValuationInput и выдает исключение.
Я сделал быстрый хак, который отлично работает:
string valuationInputStr = (string)
Settings.Default.Properties["ValuationInput"].DefaultValue;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ValuationInput));
ValuationInput valuationInput = (ValuationInput) xmlSerializer.Deserialize(new StringReader(valuationInputStr));
Но это действительно некрасиво — когда я использую весь инструмент для определения строго типизированного параметра, я не хочу сам сериализовать значение по умолчанию, я хотел бы прочитать его так же, как я читаю текущее значение: ValuationInput valuationInput = Settings.Default.ValuationInput;
Решение
В какой-то момент кому-то и где-то придется использовать десериализацию Xml, будь то вы или оболочка внутри класса настроек.Вы всегда можете абстрагировать его с помощью метода удаления «уродливого» кода из вашей бизнес-логики.
public static T FromXml<T>(string xml)
{
XmlSerializer xmlser = new XmlSerializer(typeof(T));
using (System.IO.StringReader sr = new System.IO.StringReader(xml))
{
return (T)xmlser.Deserialize(sr);
}
}
http://www.vonsharp.net/PutDownTheXmlNodeAndStepAwayFromTheStringBuilder.aspx
Другие советы
@Грзенио,
Почему бы вам не использовать свой тип объекта напрямую?Вы можете установить тип настройки на вкладке «Свойства проекта» -> «Настройки».Вы можете выбрать свой тип, нажав кнопку «Обзор» в раскрывающемся списке столбца «Тип».
Цитата из MSDN:
Настройки приложения могут быть сохранены как любой тип данных, который является сериализуемой XML, или имеет типконвертер, который реализует ToString/FromString
Таким образом, вы можете иметь строго типизированные настройки, т.е.(ValuationInput) Settings.Default.Properties["ValuationInput"].DefaultValue;вернет объект вместо строки.