Estoy creando una aplicación simple de Windows Forms usando C # express 2008. Soy un desarrollador experimentado de C ++, pero soy bastante nuevo en C # y .NET.
Actualmente estoy almacenando algunas de las configuraciones de mi aplicación simple usando el diseñador de configuraciones y un código como este:
// Store setting
Properties.Settings.Default.TargetLocation = txtLocation.Text;
...
// Restore setting
txtLocation.Text = Properties.Settings.Default.TargetLocation;
Ahora me gustaría almacenar una matriz de ints ( int[]
), o posiblemente una Lista de ints ( List< int >
), como configuración. Sin embargo, no puedo averiguar cómo hacer esto. He buscado en la documentación, stackoverflow y google, y no puedo encontrar una explicación decente de cómo hacer esto.
Mi corazonada basada en los ejemplos escasos que he encontrado es que tengo que crear una clase que sea serializable que envuelva mi matriz o Lista, y luego podré usar ese Tipo en el diseñador de configuraciones. Sin embargo, no estoy seguro de cómo hacer esto exactamente.
int[]
se vería así (excepto que está bastante impresa):<setting name="SomeTestSetting" serializeAs="String"><value><ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><int>1</int><int>2</int><int>3</int></ArrayOfInt></value></setting>
Almacenar:
string value = String.Join(",", intArray.Select(i => i.ToString()).ToArray());
para recrear:
int[] arr = value.Split(',').Select(s => Int32.Parse(s)).ToArray();
Editar: ¡sugerencia de Abel!
fuente
System.Linq
agregado a sus usos / importaciones para que funcione el truco anterior.Hay otra forma de lograr este resultado que es mucho más limpia en el uso pero requiere más código. Al implementar un tipo personalizado y un convertidor de tipos, el siguiente código es posible:
Para lograr esto, necesita un tipo con un convertidor de tipos que permita la conversión hacia y desde cadenas. Para ello, decora el tipo con TypeConverterAttribute:
Luego, implementando este convertidor de tipos como una derivación de TypeConverter:
Al proporcionar algunos métodos de conveniencia en la clase MyNumberArray, podemos asignar de manera segura ay desde List, la clase completa se vería así:
Por último, para usar esto en la configuración, agregue las clases anteriores a un ensamblado y compile. En su editor Settings.settings, simplemente haga clic en la opción "Examinar" y seleccione la clase MyNumberArray y listo.
Nuevamente, esto es mucho más código; sin embargo, se puede aplicar a tipos de datos mucho más complicados que un arreglo simple.
fuente
Especifique la configuración como System.Collections.ArrayList y luego:
fuente
Una solución simple es establecer el valor predeterminado de una configuración en nulo en la propiedad, pero en el constructor verifique si la propiedad es nula y, si es así, configúrelo en su valor predeterminado real. Entonces, si quisieras una variedad de entradas:
Se siente un poco hacky, pero está limpio y funciona como se desea, ya que las propiedades se inicializan a su última configuración (o predeterminada) antes de que se llame al constructor.
fuente
Usado
System.Object
.Ejemplo:
Extraer:
fuente
Creo que tienes razón al serializar tu configuración. Vea mi respuesta a esta pregunta para obtener una muestra:
¿Técnicas para compartir una configuración entre dos aplicaciones?
Tendría una propiedad que es una matriz, como esta:
fuente
Haga algunas funciones que conviertan una matriz int en una cadena, pero entre cada una coloque un carácter como "" (espacio).
Entonces, si la matriz es {1,34,546,56}, la cadena sería "1 34645 56"
fuente