Valores padrão de propriedade usando Properties.Settings.Default
Pergunta
Estou usando o .Net 2 e a maneira normal de armazenar minhas configurações.Eu armazeno meu objeto personalizado serializado em xml.Estou tentando recuperar o valor padrão da propriedade (mas sem redefinir outras propriedades).Eu uso:
ValuationInput valuationInput = (ValuationInput) Settings.Default.Properties["ValuationInput"].DefaultValue;
Mas parece retornar uma string em vez de ValuationInput e gera uma exceção.
Fiz um hack rápido, que funciona bem:
string valuationInputStr = (string)
Settings.Default.Properties["ValuationInput"].DefaultValue;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ValuationInput));
ValuationInput valuationInput = (ValuationInput) xmlSerializer.Deserialize(new StringReader(valuationInputStr));
Mas isso é realmente feio - quando uso toda a ferramenta para definir uma configuração fortemente digitada, não quero serializar o valor padrão sozinho, gostaria de lê-lo da mesma forma que leio o valor atual: ValuationInput valuationInput = Settings.Default.ValuationInput;
Solução
Em algum momento, algo, em algum lugar, terá que usar a desserialização Xml, seja você ou um wrapper dentro da classe de configurações.Você sempre pode abstraí-lo em um método para remover o código "feio" da sua lógica de negócios.
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
Outras dicas
@Grzenio,
Por que você não usa seu tipo de objeto diretamente?Você pode definir o tipo de sua configuração na guia Propriedades do projeto-> Configurações.Você pode selecionar seu tipo clicando em Navegar no menu suspenso da coluna Tipo.
Citação do MSDN:
As configurações de aplicativos podem ser armazenadas como qualquer tipo de dados que seja serializável XML ou possui um TypeConverter que implementa a ToString/FromString
Dessa forma, você pode ter configurações fortemente digitadas, ou seja,(ValuationInput) Configurações.Default.Properties["ValuationInput"].DefaultValue;retornará um objeto em vez de string.