2011-02-19 9 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'の値を文字列に変換できません。エラーは、 'バージョン'タイプのプロパティ 'ver'の文字列への変換をサポートするコンバータを見つけることができません。

System.Version.ToString()System.Version.ctor(string)によって消耗され、よく知られた文字列形式にオブジェクトを書き込むので、このタイプのために存在する「変換」を実現可能と思われます。同様に、System.TimeSpanタイプは同様のメソッドとファンクション(Parse in-place .ctor(string))を持ち、このタイプは設定システムでうまく機能します(コンバータはすでに存在している必要があります)。

タイプに適したコンバータがあるかどうかを確認するにはどうすればよいですか?どのような契約(暗黙的またはそうでなければ)は、そのようなタイプが満たされなければならないか?

+0

一つの方法は、それをデシリアライズしてかどうかを確認しようとするだろうこの例外が発生します。 –

+0

VersionクラスはXMLシリアル化可能ではなく、すべてのプロパティは読み取り専用です。あなた自身を作る。 –

答えて

4

ConfigurationPropertyを動作させるには、文字列から変換する方法を知っているよりも、使用する型をTypeConverterに関連付ける必要があります。 ConfigurationPropertyにはConverterというプロパティがありますが、まあ、読み込み専用です。そして、それは本当に悪いことです。バージョンには暗黙のTypeConverterも宣言されていません。

何ができるのですか?プログラムでVersionクラスにTypeConverterAttributeを追加すると、これらの問題を回避できます。次のカスタムメイドVersionTypeConverterで

TypeDescriptor.AddAttributes(typeof(Version), new TypeConverterAttribute(typeof(VersionTypeConverter))); 
// ... you can call configuration code now... 

:だから、基本的な構成にアクセスする前に、あなたのプログラムに一度、この行を呼び出す必要が

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

さて、やった!それはあまりにも悪いことです。アプリの設定やイベントによってこれらのタイプを登録することはできません。前者の方が有効にするのは難しいことではありません。 –

関連する問題