이 결과를 얻을 수있는 또 다른 방법은 사용이 훨씬 깨끗하지만 더 많은 코드가 필요합니다. 사용자 지정 형식 및 형식 변환기를 구현하면 다음 코드가 가능합니다.
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 클래스에 몇 가지 편리한 메서드를 제공하면 List에 안전하게 할당 할 수 있으며 전체 클래스는 다음과 같습니다.
[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 클래스를 선택하기 만하면됩니다.
다시 말하지만 이것은 훨씬 더 많은 코드입니다. 그러나 단순한 배열보다 훨씬 복잡한 유형의 데이터에 적용 할 수 있습니다.