还有一种更加简洁易用但需要更多代码的方法可以实现这个结果,即通过实现自定义类型和类型转换器来实现以下代码:
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类,就可以开始使用了。
同样,这需要更多的代码;但是,它可以应用于比简单数组更复杂的数据类型。
int[]
的配置文件 XML 语法看起来会像这样(未进行格式化):<setting name="SomeTestSetting" serializeAs="String"><value><ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><int>1</int><int>2</int><int>3</int></ArrayOfInt></value></setting>
。 - aaaantoine