Valores predeterminados de propiedad usando Properties.Settings.Default
Pregunta
Estoy usando .Net 2 y la forma normal de almacenar mi configuración.Almaceno mi objeto personalizado serializado en xml.Estoy intentando recuperar el valor predeterminado de la propiedad (pero sin restablecer otras propiedades).Yo suelo:
ValuationInput valuationInput = (ValuationInput) Settings.Default.Properties["ValuationInput"].DefaultValue;
Pero parece devolver una cadena en lugar de ValuationInput y genera una excepción.
Hice un truco rápido, que funciona bien:
string valuationInputStr = (string)
Settings.Default.Properties["ValuationInput"].DefaultValue;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ValuationInput));
ValuationInput valuationInput = (ValuationInput) xmlSerializer.Deserialize(new StringReader(valuationInputStr));
Pero esto es realmente feo: cuando uso todas las herramientas para definir una configuración fuertemente tipada, no quiero serializar el valor predeterminado, me gustaría leerlo de la misma manera que leo el valor actual: ValuationInput valuationInput = Settings.Default.ValuationInput;
Solución
En algún momento, algo, en algún lugar, tendrá que usar la deserialización Xml, ya sea usted o un contenedor dentro de la clase de configuración.Siempre puedes abstraerlo en un método para eliminar el código "feo" de tu lógica empresarial.
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
Otros consejos
@Grzenio,
¿Por qué no utilizas tu tipo de objeto directamente?Puede establecer el tipo de configuración en Propiedades del proyecto->pestaña Configuración.Puede seleccionar su tipo haciendo clic en Examinar en el menú desplegable de la columna Tipo.
Cita de MSDN:
La configuración de la aplicación se puede almacenar como cualquier tipo de datos que sea serializable XML o tiene un typeconverter que implementa tostring/fromtring
De esa manera puede tener configuraciones fuertemente tipadas, es decir.(ValuationInput) Configuración.Default.Properties["ValuationInput"].DefaultValue;devolverá un objeto en lugar de una cadena.