Je crée une application Windows Forms simple en utilisant C # express 2008. Je suis un développeur C ++ expérimenté, mais je suis à peu près tout nouveau dans C # et .NET.
Je stocke actuellement certains de mes paramètres d'application simples à l'aide du concepteur de paramètres et d'un code comme celui-ci:
// Store setting
Properties.Settings.Default.TargetLocation = txtLocation.Text;
...
// Restore setting
txtLocation.Text = Properties.Settings.Default.TargetLocation;
Maintenant, j'aimerais stocker soit un tableau de ints ( int[]
), soit éventuellement une liste d'ints ( List< int >
), en tant que paramètre. Cependant, je ne peux pas comprendre comment faire cela. J'ai recherché la documentation, le stackoverflow et Google, et je ne trouve pas d'explication décente sur la façon de procéder.
Mon intuition basée sur les exemples rares que j'ai trouvés est que je dois créer une classe sérialisable qui encapsule mon tableau ou ma liste, puis je pourrai utiliser ce type dans le concepteur de paramètres. Cependant, je ne sais pas exactement comment procéder.
int[]
ressemblerait à ceci (sauf assez imprimée):<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>
ranger:
string value = String.Join(",", intArray.Select(i => i.ToString()).ToArray());
pour recréer:
int[] arr = value.Split(',').Select(s => Int32.Parse(s)).ToArray();
Edit: suggestion d'Abel!
la source
System.Linq
ajouté à vos utilisations / importations pour que l'astuce ci-dessus fonctionne.Il existe une autre façon d'obtenir ce résultat qui est beaucoup plus propre dans l'utilisation mais qui nécessite plus de code. Mon implémentation d'un type personnalisé et d'un convertisseur de type, le code suivant est possible:
Pour ce faire, vous avez besoin d'un type avec un convertisseur de type qui permet la conversion vers et à partir de chaînes. Vous faites cela en décorant le type avec le TypeConverterAttribute:
Ensuite, implémentation de ce convertisseur de type en tant que dérivation de TypeConverter:
En fournissant des méthodes pratiques sur la classe MyNumberArray, nous pouvons ensuite attribuer en toute sécurité à et à partir de List, la classe complète ressemblerait à quelque chose comme:
Enfin, pour l'utiliser dans les paramètres, vous ajoutez les classes ci-dessus à un assembly et compilez. Dans votre éditeur Settings.settings, cliquez simplement sur l'option "Parcourir" et sélectionnez la classe MyNumberArray et c'est parti.
Encore une fois, c'est beaucoup plus de code; cependant, il peut être appliqué à des types de données beaucoup plus compliqués qu'un simple tableau.
la source
Spécifiez le paramètre en tant que System.Collections.ArrayList, puis:
la source
Une solution simple consiste à définir la valeur par défaut d'un paramètre sur null dans la propriété, mais dans le constructeur, vérifiez si la propriété est nulle et, le cas échéant, définissez-la sur sa valeur par défaut réelle. Donc, si vous vouliez un tableau d'entiers:
Cela semble un peu piraté, mais c'est propre et fonctionne comme vous le souhaitez puisque les propriétés sont initialisées à leurs derniers paramètres (ou par défaut) avant que le constructeur ne soit appelé.
la source
Utilisé
System.Object
.Exemple:
Extrait:
la source
Je pense que vous avez raison de sérialiser vos paramètres. Voir ma réponse à cette question pour un exemple:
Techniques pour partager une configuration entre deux applications?
Vous auriez une propriété qui est un tableau, comme ceci:
la source
Créez des fonctions qui convertissent un tableau int en une chaîne, mais entre chacune, placez un caractère comme "" (espace).
Donc, si le tableau est {1,34,546,56}, la chaîne serait "1 34 645 56"
la source