Có một cách khác để đạt được kết quả này là cách sử dụng gọn gàng hơn rất nhiều nhưng yêu cầu nhiều mã hơn. Việc triển khai công cụ chuyển đổi loại và loại tùy chỉnh của tôi có thể thực hiện được mã sau:
List<int> array = Settings.Default.Testing;
array.Add(new Random().Next(10000));
Settings.Default.Testing = array;
Settings.Default.Save();
Để đạt được điều này, bạn cần một loại có bộ chuyển đổi loại cho phép chuyển đổi sang và từ chuỗi. Bạn thực hiện việc này bằng cách trang trí loại bằng TypeConverterAttribute:
[TypeConverter(typeof(MyNumberArrayConverter))]
public class MyNumberArray ...
Sau đó, triển khai trình chuyển đổi kiểu này như một dẫn xuất của 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);
}
}
Bằng cách cung cấp một số phương thức tiện lợi trên lớp MyNumberArray, sau đó chúng ta có thể gán vào và từ List một cách an toàn, lớp hoàn chỉnh sẽ trông giống như sau:
[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(); }
}
Cuối cùng, để sử dụng điều này trong cài đặt, bạn thêm các lớp trên vào một hợp ngữ và biên dịch. Trong trình soạn thảo Settings.settings, bạn chỉ cần nhấp vào tùy chọn "Duyệt qua" và chọn lớp MyNumberArray và bạn bắt đầu.
Một lần nữa, đây là nhiều mã hơn; tuy nhiên, nó có thể được áp dụng cho các kiểu dữ liệu phức tạp hơn nhiều so với một mảng đơn giản.