มีอีกวิธีหนึ่งที่จะทำให้ได้ผลลัพธ์นี้คือการใช้งานที่สะอาดกว่ามาก แต่ต้องใช้รหัสมากขึ้น ฉันใช้ตัวแปลงประเภทและประเภทที่กำหนดเองรหัสต่อไปนี้เป็นไปได้:
List<int> array = Settings.Default.Testing;
array.Add(new Random().Next(10000));
Settings.Default.Testing = array;
Settings.Default.Save();
เพื่อให้บรรลุสิ่งนี้คุณต้องมีประเภทที่มีตัวแปลงประเภทที่อนุญาตให้แปลงเป็นและจากสตริง คุณทำได้โดยการตกแต่งประเภทด้วย TypeConverterAttribute:
[TypeConverter(typeof(MyNumberArrayConverter))]
public class MyNumberArray ...
จากนั้นใช้ตัวแปลงประเภทนี้เป็นที่มาของ 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);
}
}
ด้วยวิธีการอำนวยความสะดวกบางอย่างในคลาส MyNumberArray จากนั้นเราสามารถกำหนดเข้าและออกจากรายการได้อย่างปลอดภัยคลาสที่สมบูรณ์จะมีลักษณะดังนี้:
[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(); }
}
สุดท้ายเพื่อใช้สิ่งนี้ในการตั้งค่าคุณจะเพิ่มคลาสข้างต้นในแอสเซมบลีและคอมไพล์ ในตัวแก้ไข Settings.settings ของคุณคุณเพียงแค่คลิกตัวเลือก "เรียกดู" และเลือกคลาส MyNumberArray และปิดคุณไป
อีกครั้งนี่เป็นรหัสที่มากขึ้น อย่างไรก็ตามสามารถนำไปใช้กับข้อมูลประเภทที่ซับซ้อนกว่าอาร์เรย์ธรรมดา