为什么这个集合似乎包含对象?

时间:2013-03-06 02:28:22

标签: c# xml configuration app-config

我有一个" ImageElementCollection:ConfigurationElementCollection"包含类的元素" ImageElement:ConfigurationElement"。

在StackOverflow上使用其他一些非常聪明的人的建议,我已经想出如何在我的程序中使用这些项目:

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

但是,当我尝试访问此集合中的项目时......

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

...我最终在Name属性下使用了波浪线,因为" image"尽管我付出了最大的努力,但它已被宣布为一个对象而不是一个ImageElement。

这是我在我的声明中做错了什么,或者这只是每个人通过交换" var"来处理的事情。 for" ImageElement"那个foreach在那里?

下面的配置处理程序代码:

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"]; }
    }
}

1 个答案:

答案 0 :(得分:2)

Andrew Kennan在上面的评论中提供了答案:此集合似乎只包含对象,因为它没有实现IEnumerable< T&gt ;.

此外,可以通过稍微调整配置处理程序来解决该问题。只需添加IEnumerable接口,如下所示......

public class ImageElementCollection : ConfigurationElementCollection, IEnumerable<ImageElement>

...然后在课堂上粘贴一个类似这样的方法:

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

谢谢你,安德鲁。