Il existe une autre façon de parvenir à ce résultat qui est beaucoup plus propre à l'usage, mais nécessite plus de code. Ma mise en œuvre d'un type personnalisé et le type de convertisseur le code suivant est possible:
List<int> array = Settings.Default.Testing;
array.Add(new Random().Next(10000));
Settings.Default.Testing = array;
Settings.Default.Save();
Pour réaliser cela, vous avez besoin d'un type avec un type de convertisseur qui permet la conversion vers et à partir de chaînes de caractères. Vous faites cela en décorant le type avec la TypeConverterAttribute:
[TypeConverter(typeof(MyNumberArrayConverter))]
public class MyNumberArray ...
Ensuite, la mise en œuvre de ce type de convertisseur comme une dérivation de TypeConverter:
class MyNumberArrayConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext ctx, Type type)
{ return (type == typeof(string)); }
public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type)
{ return (type == typeof(string)); }
public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type)
{
MyNumberArray arr = value as MyNumberArray;
StringBuilder sb = new StringBuilder();
foreach (int i in arr)
sb.Append(i).Append(',');
return sb.ToString(0, Math.Max(0, sb.Length - 1));
}
public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data)
{
List<int> arr = new List<int>();
if (data != null)
{
foreach (string txt in data.ToString().Split(','))
arr.Add(int.Parse(txt));
}
return new MyNumberArray(arr);
}
}
Par la fourniture de certaines méthodes pratiques sur le MyNumberArray classe on peut alors attribuer en toute sécurité vers et à partir de la Liste, l'ensemble de la classe ressemblerait à quelque chose comme:
[TypeConverter(typeof(MyNumberArrayConverter))]
public class MyNumberArray : IEnumerable<int>
{
List<int> _values;
public MyNumberArray() { _values = new List<int>(); }
public MyNumberArray(IEnumerable<int> values) { _values = new List<int>(values); }
public static implicit operator List<int>(MyNumberArray arr)
{ return new List<int>(arr._values); }
public static implicit operator MyNumberArray(List<int> values)
{ return new MyNumberArray(values); }
public IEnumerator<int> GetEnumerator()
{ return _values.GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator()
{ return ((IEnumerable)_values).GetEnumerator(); }
}
Enfin, de l'utiliser dans les paramètres, vous ajoutez les classes ci-dessus à une assemblée et de les compiler. Dans vos Paramètres.les paramètres de l'éditeur vous suffit de cliquer sur le bouton "Parcourir" et sélectionnez le MyNumberArray classe et vous partez.
Encore une fois c'est beaucoup plus de code; toutefois, il peut être appliqué à beaucoup plus compliqué types de données qu'un simple tableau.