2011-02-19 15 views
4

作爲示例,我想序列化並反序列化一個System.Version對象作爲我的應用程序的自定義配置部分的一部分。我試圖用下面的屬性聲明這樣做:與ConfigurationProperty屬性一起使用時,屬性類型的隱式協定是什麼?

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'的值不能轉換爲字符串。錯誤是:找不到類型爲'Version'的屬性'ver'支持轉換爲字符串的轉換器。

System.Version.ToString()將對象寫入可以被System.Version.ctor(string)使用的衆所周知的字符串格式,因此對於這種類型的「轉換器」來說似乎是可行的。相比之下,System.TimeSpan類型具有類似的方法和功能(Parse就位於.ctor(string)),並且該類型與配置系統(轉換器必須已經存在)配合良好。

如何知道類型是否有合適的轉換器?什麼合同(隱含的或其他的)必須滿足這種類型?

+0

一種方法是嘗試反序列化一下,看看是否你會得到這個例外。 –

+0

Version類不是XML可串行的,其所有屬性都是隻讀的。做你自己的。 –

回答

4

要使ConfigurationProperty工作,所使用的類型必須與TypeConverter關聯,而不知道如何從字符串轉換。 ConfigurationProperty具有Converter屬性,但是,它是隻讀的。而且,這真是太糟糕了,版本沒有隱式的TypeConverter聲明。

儘管如此,您可以通過編程方式將TypeConverterAttribute添加到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); 
    } 
} 
+0

幹得好,先生!這太糟糕了,我們無法通過應用配置或某些事件註冊這些類型。前者不會太難以啓用。 –

相關問題