如果我对您的问题的解释正确,那么您有一个自定义类型,我们称之为CustomSetting,您可以在您的Settings.settings 文件中设置该类型的设置,并使用@ 指定该设置的默认值987654324@ 或 Visual Studio 的设置 UI。
如果这是您想要做的,您需要为您的类型提供一个TypeConverter,它可以从字符串转换,如下所示:
[TypeConverter(typeof(CustomSettingConverter))]
public class CustomSetting
{
public string Foo { get; set; }
public string Bar { get; set; }
public override string ToString()
{
return string.Format("{0};{1}", Foo, Bar);
}
}
public class CustomSettingConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if( sourceType == typeof(string) )
return true;
else
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
string stringValue = value as string;
if( stringValue != null )
{
// Obviously, using more robust parsing in production code is recommended.
string[] parts = stringValue.Split(';');
if( parts.Length == 2 )
return new CustomSetting() { Foo = parts[0], Bar = parts[1] };
else
throw new FormatException("Invalid format");
}
else
return base.ConvertFrom(context, culture, value);
}
}
一些背景资料
TypeConverter 支持 .Net 框架中的许多字符串转换魔法。它不仅对设置有用,而且还用于 Windows 窗体和组件设计人员如何将属性网格中的值转换为其目标类型,以及 XAML 如何转换属性值。该框架的许多类型都有自定义的 TypeConverter 类,包括所有基本类型,但也包括 System.Drawing.Size 或 System.Windows.Thickness 等类型。
在您自己的代码中使用 TypeConverter 非常简单,您只需这样做:
TypeConverter converter = TypeDescriptor.GetConverter(typeof(TargetType));
if( converter != null && converter.CanConvertFrom(typeof(SourceType)) )
targetValue = (TargetType)converter.ConvertFrom(sourceValue);
支持的源类型各不相同,但string 是最常见的一种。与普遍存在但不太灵活的 Convert 类(仅支持原始类型)相比,它是一种更强大(不幸的是鲜为人知)从字符串转换值的方法。