0

クラス「ImageElement:ConfigurationElement」の要素を含むクラス「ImageElementCollection:ConfigurationElementCollection」があります。

ここ StackOverflow で他の非常に知的な人のアドバイスを使用して、私は自分のプログラムでこれらの項目を利用する方法を考え出しました。

MonitorConfig Config = (MonitorConfig)ConfigurationManager.GetSection("MonitorConfig");

ただし、このコレクションのアイテムにアクセスしようとすると...

foreach (var image in Config.Images) Debug.WriteLine(image.Name);

...最善の努力にもかかわらず、"image" が ImageElement ではなくオブジェクトとして宣言されているため、Name プロパティの下に波線が表示されます。

これは私の宣言で間違っていることですか、それとも、その foreach で「var」を「ImageElement」に交換することで誰もが対処するだけですか?

以下にある構成ハンドラーのコード:

public class MonitorConfig : ConfigurationSection
{
    [ConfigurationProperty("Frequency", DefaultValue = 5D, IsRequired = false)]
    public double Frequency
    {
        get { return (double)this["Frequency"]; }
    }

    [ConfigurationProperty("Images", IsRequired = false)]
    public ImageElementCollection Images
    {
        get { return (ImageElementCollection)this["Images"]; }
    }
}

[ConfigurationCollection(typeof(ImageElement), AddItemName = "Image")]
public class ImageElementCollection : ConfigurationElementCollection
{
    public ImageElement this[object elementKey]
    {
        get { return (ImageElement)BaseGet(elementKey); }
    }

    public void Add(ImageElement element)
    {
        base.BaseAdd(element);
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new ImageElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((ImageElement)element).Name;
    }
}

public class ImageElement : ConfigurationElement
{
    [ConfigurationProperty("Name", IsRequired = true, IsKey = true)]
    public string Name 
    { 
        get { return (string)this["Name"]; }
    }
}
4

1 に答える 1

2

Andrew Kennan が上記のコメントで回答を提供しました。このコレクションには IEnumerable<T> が実装されていないため、オブジェクトのみが含まれているようです。

さらに、構成ハンドラーを少し調整することで、その問題を修正することができます。次のように IEnumerable インターフェイスを追加するだけです...

public class ImageElementCollection : ConfigurationElementCollection, IEnumerable<ImageElement>

...そして、クラスの本体に次のようなメソッドを貼り付けます。

public new IEnumerator<ImageElement> GetEnumerator()
{
    var iter = base.GetEnumerator();
    while (iter.MoveNext()) yield return (ImageElement)iter.Current;
}

ありがとう、アンドリュー。

于 2013-03-06T03:06:32.027 に答える