Ada satu cara lain untuk mencapai hasil ini yang jauh lebih bersih dalam penggunaan tetapi membutuhkan lebih banyak kode. Saya menerapkan konverter tipe dan tipe kustom, kode berikut dimungkinkan:
List<int> array = Settings.Default.Testing;
array.Add(new Random().Next(10000));
Settings.Default.Testing = array;
Settings.Default.Save();
Untuk mencapai ini, Anda memerlukan tipe dengan konverter tipe yang memungkinkan konversi ke dan dari string. Anda melakukan ini dengan mendekorasi tipe dengan TypeConverterAttribute:
[TypeConverter(typeof(MyNumberArrayConverter))]
public class MyNumberArray ...
Kemudian mengimplementasikan konverter tipe ini sebagai turunan dari 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);
}
}
Dengan menyediakan beberapa metode praktis pada kelas MyNumberArray, kita dapat menetapkan dengan aman ke dan dari List, kelas lengkap akan terlihat seperti:
[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(); }
}
Terakhir, untuk menggunakan ini dalam pengaturan Anda menambahkan kelas di atas ke assembly dan kompilasi. Dalam editor Settings.settings Anda cukup mengklik opsi "Browse" dan memilih kelas MyNumberArray dan pergilah.
Sekali lagi ini lebih banyak kode; namun, ini dapat diterapkan pada jenis data yang jauh lebih rumit daripada larik sederhana.