4

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' の値を文字列に変換できません。エラー: タイプ 'Version' のプロパティ 'ver' の文字列との間の変換をサポートするコンバーターが見つかりません。

System.Version.ToString()はオブジェクトを、 によって消費可能なよく知られた文字列形式に書き込みますSystem.Version.ctor(string)。そのため、この型に対して「コンバーター」が存在する可能性があるようです。同様に、System.TimeSpan型には同様のメソッドと関数 (Parseの代わりに.ctor(string)) があり、型は構成システムとうまく連携します (コンバーターが既に存在している必要があります)。

型に適切なコンバーターがあるかどうかを知るにはどうすればよいですか? そのような型が満たさなければならない契約 (暗黙的またはその他) は何ですか?

4

1 に答える 1

4

ConfigurationPropertyが機能するには、使用されるタイプが、文字列から変換する方法を知っているTypeConverterに関連付けられている必要があります。ConfigurationPropertyにはConverterプロパティがありますが、残念ながら、読み取り専用です。そして、それは本当に不運です。Versionには暗黙のTypeConverterも宣言されていません。

ただし、プログラムでVersionクラスにTypeConverterAttributeを追加すると、これらすべての問題を回避できます。したがって、基本的に、構成にアクセスする前に、プログラムでこの行を1回呼び出す必要があります。

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);
    }
}
于 2012-08-16T07:55:49.590 に答える