首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当与ConfigurationProperty属性一起使用时,属性类型的隐式契约是什么?

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

Stack Overflow用户
提问于 2011-02-19 00:17:05
回答 1查看 795关注 0票数 4

例如,我希望序列化和反序列化System.Version对象,作为应用程序自定义配置部分的一部分。我试图通过以下的财产声明来做到这一点:

代码语言:javascript
复制
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”的字符串转换的“Version”类型。

System.Version.ToString()将对象写入System.Version.ctor(string)可使用的著名字符串格式,因此对于这种类型来说,存在一个“转换器”似乎是可行的。相比之下,System.TimeSpan类型具有类似的方法和功能(Parse代替.ctor(string)),并且该类型与配置系统(必须已经存在转换器)很好地工作。

我如何知道一个类型是否有一个合适的转换器?这种类型必须满足什么样的契约(隐含的或其他的)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-16 07:55:49

要使ConfigurationProperty工作,所使用的类型必须与知道如何从字符串转换的TypeConverter相关联。ConfigurationProperty确实有一个转换器属性,但是唉,它是只读的。而且,这真是倒霉,版本中也没有隐式TypeConverter声明。

不过,您可以通过编程方式向Version类添加一个TypeConverterAttribute,它将解决所有这些问题。因此,在访问配置之前,基本上需要在程序中调用这一行:

代码语言:javascript
复制
TypeDescriptor.AddAttributes(typeof(Version), new TypeConverterAttribute(typeof(VersionTypeConverter)));
// ... you can call configuration code now...

使用以下定制的VersionTypeConverter:

代码语言:javascript
复制
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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5047921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档