与ConfigurationProperty属性一起使用时,属性类型的隐式契约是什么?

作为一个例子,我想序列化和反序列化一个
System.Version
对象作为我的应用程序的自定义配置部分的一部分。我试图使用以下属性声明:
public class ConfigElement : ConfigurationElement
{
    [ConfigurationProperty("ver", IsRequired = false, DefaultValue = "1.2.4.8")]
    public Version Ver
    {
        get { return (Version)this["ver"]; }
        set { this["ver"] = value; }
    }
}
不幸的是,尝试序列化或使用此属性(使用或不使用
DefaultValue
)会产生以下异常消息。 System.Configuration.ConfigurationErrorsException:属性“ver”的值无法转换为字符串。错误是:无法找到支持转换为/来自字符串的转换为“版本”类型的属性“ver”的转换器。
System.Version.ToString()
将对象写入一个可被ѭ4消耗的众所周知的字符串格式,因此对于这种类型的“转换器”来说似乎是可行的。相比之下,
System.TimeSpan
类型具有类似的方法和功能(
Parse
代替
.ctor(string)
),并且该类型适用于配置系统(转换器必须已经存在)。 我如何知道某种型号是否有合适的转换器?这种类型必须满足什么契约(隐含的或其他的)?     
已邀请:
要使ConfigurationProperty起作用,所使用的类型必须与TypeConverter相关联,而不是知道如何从字符串转换。 ConfigurationProperty确实有一个Converter属性,但是它是只读的。而且,这真的是运气不好,Version也没有声明隐式的TypeConverter。 你可以做的是,以编程方式将VersionConverterAttribute添加到Version类,它将解决所有这些问题。因此,在访问配置之前,您需要在程序中基本调用此行一次:
TypeDescriptor.AddAttributes(typeof(Version), new TypeConverterAttribute(typeof(VersionTypeConverter)));
// ... you can call configuration code now...
使用以下定制的VersionTypeConverter:
public class VersionTypeConverter : TypeConverter
{
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        return new Version((string)value);
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
            return true;

        return base.CanConvertFrom(context, sourceType);
    }
}
    

要回复问题请先登录注册