Es gibt einen anderen Weg, um dieses Ergebnis zu erzielen, der viel sauberer in der Verwendung ist, aber mehr Code erfordert. Bei der Implementierung eines benutzerdefinierten Typs und Typkonverters ist der folgende Code möglich:
List<int> array = Settings.Default.Testing;
array.Add(new Random().Next(10000));
Settings.Default.Testing = array;
Settings.Default.Save();
Um dies zu erreichen, benötigen Sie einen Typ mit einem Typkonverter, der die Konvertierung in und von Zeichenfolgen ermöglicht. Sie tun dies, indem Sie den Typ mit dem TypeConverterAttribute dekorieren:
[TypeConverter(typeof(MyNumberArrayConverter))]
public class MyNumberArray ...
Implementieren Sie dann diesen Typkonverter als Ableitung von 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);
}
}
Durch die Bereitstellung einiger praktischer Methoden für die MyNumberArray-Klasse, die wir dann sicher der und von List zuweisen können, würde die gesamte Klasse ungefähr so aussehen:
[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(); }
}
Um dies in den Einstellungen zu verwenden, fügen Sie die obigen Klassen zu einer Assembly hinzu und kompilieren sie. In Ihrem Settings.settings-Editor klicken Sie einfach auf die Option "Durchsuchen" und wählen die MyNumberArray-Klasse aus.
Auch dies ist viel mehr Code; Es kann jedoch auf viel kompliziertere Datentypen angewendet werden als ein einfaches Array.