1

私はいくつかの古いレガシー参照を削除しようとしている最中であり、今までやったことがなかったことに取り組んでいます。次のような構成ファイル セクションがあるとします。

<customSection>
    <customValues>
      <custom key="foo" invert="True">
         <value>100</value>
      </custom>
      <custom key="bar" invert="False">
         <value>200</value>
      </custom>
    </customValues>
</customSection>

このすべてを正しく読み取るために、ConfigurationSection、ConfigurationElement、および ConfigurationElementCollection クラスを作成しました。ここにそれらを示します (要素の値を取得するために Deserialize メソッドをオーバーライドする ValueElement クラスを除いて、基本的にすべてボイラー プレートです)。

public class CustomSection : ConfigurationSection
{
    [ConfigurationProperty("customValues")]
    [ConfigurationCollection(typeof(CustomValueCollection), AddItemName = "custom")]
    public CustomValueCollection CustomValues
    {
        get { return (CustomValueCollection)this["customValues"]; }
    }
}

public class CustomValueCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new CustomElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((CustomElement) element).Key;
    }

    public CustomElement this[int index]
    {
        get { return (CustomElement) BaseGet(index); }
    }

    new public CustomElement this[string key]
    {
        get { return (CustomElement) BaseGet(key); }
    }

    public bool ContainsKey(string key)
    {
        var keys = new List<object>(BaseGetAllKeys());
        return keys.Contains(key);
    }
}

public class CustomElement : ConfigurationElement
{
    [ConfigurationProperty("key", IsRequired = true)]
    public string Key
    {
        get { return (string)this["key"]; }
    }

    [ConfigurationProperty("invert", IsRequired = true)]
    public bool Invert
    {
        get { return (bool)this["invert"]; }
    }

    [ConfigurationProperty("value", IsRequired = true)]
    public ValueElement Value
    {
        get { return (ValueElement)this["value"]; }
    }
}

public class ValueElement : ConfigurationElement
{
    private int value;

    //used to get value of element, not of an attribute
    protected override void DeserializeElement(System.Xml.XmlReader reader, bool serializeCollectionKey)
    {
        value = (int)reader.ReadElementContentAs(typeof(int), null);
    }

    public int Value
    {
        get { return value; }
    }
}

私が今行き詰まっているのは、このビジネス要件です。CustomElement の Invert 値が true の場合、関連する ValueElement の Value プロパティの値を反転します。したがって、「foo」の下の「value」の値にアクセスすると、-100 が返されます。

そのようなものを ValueElement オブジェクトに渡す方法、またはその親の CustomElement を ValueElement に認識させてその Invert プロパティを取得する方法を知っている人はいますか? 私の最初の考えは、CustomElement クラスの Value プロパティ ゲッターでチェックを行い、Invert が true の場合はそこで ValueElement オブジェクトを変更することですが、他のアイデアも受け入れます。

ここでの目標は、構成ファイルに手を加えずにレガシー コードを削除することです。それ以外の場合は、「値」サブ要素を属性として親にプッシュします。

ありがとう

4

1 に答える 1