从ConfigurationElementCollection获取配置元素

时间:2010-05-06 19:47:15

标签: c# system.configuration configurationelement

我(希望)设置我自己设计的ConfigurationElementCollection,并将电子邮件作为键。怎么办?很难在网上找到。我如何:

  1. 迭代它?

  2. 查看是否存在特定元素?

  3. 获取特定元素?

  4. ...式给出:

        YourConfigElement config = 
       ConfigurationManager.GetSection("YourSectionName") as YourConfigElement;
    

    部分回答

    1

     foreach (X x in config.XCollection) 
                 <code here>
    

    2。用

    替换“这里的代码”
     { 
        if (x.Y == needle) 
        {
           hasIndeed = true;
           break;
        }
     }
    

    3。用

    替换“这里的代码”
     { if (x.Y == needle) 
           cameUpWith = x;
           break;
     }
    

    微小气味。

2 个答案:

答案 0 :(得分:8)

您想要的是您自己的通用ConfigurationElementCollection基类,它实现了IList<T>。然后,您可以从此继承所有配置集合,并减少创建配置集合时需要完成的工作量。

public abstract class BaseConfigurationElementCollection<TConfigurationElementType> : ConfigurationElementCollection, IList<TConfigurationElementType> where TConfigurationElementType : ConfigurationElement, IConfigurationElementCollectionElement, new()
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new TConfigurationElementType();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((TConfigurationElementType)element).ElementKey;
    }

    public IEnumerator<TConfigurationElement> GetEnumerator()
    {
        foreach (TConfigurationElement type in this)
        {
            yield return type;
        }
    }

    public void Add(TConfigurationElementType configurationElement)
    {
        BaseAdd(configurationElement, true);
    }

    public void Clear()
    {
        BaseClear();
    }

    public bool Contains(TConfigurationElementType configurationElement)
    {
        return !(IndexOf(configurationElement) < 0);
    }

    public void CopyTo(TConfigurationElementType[] array, int arrayIndex)
    {
        base.CopyTo(array, arrayIndex);
    }

    public bool Remove(TConfigurationElementType configurationElement)
    {
        BaseRemove(GetElementKey(configurationElement));

        return true;
    }

    bool ICollection<TConfigurationElementType>.IsReadOnly
    {
        get { return IsReadOnly(); }
    }

    public int IndexOf(TConfigurationElementType configurationElement)
    {
        return BaseIndexOf(configurationElement);
    }

    public void Insert(int index, TConfigurationElementType configurationElement)
    {
        BaseAdd(index, configurationElement);
    }

    public void RemoveAt(int index)
    {
        BaseRemoveAt(index);
    }

    public TConfigurationElementType this[int index]
    {
        get
        {
            return (TConfigurationElementType)BaseGet(index);
        }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }
}

通过更多的工作,你也可以收集字典。

答案 1 :(得分:2)

我不完全理解您的问题是什么 - 但基本上,如果您有自定义配置元素,您应该能够使用以下内容从配置文件中检索它:

YourConfigElement config = 
    ConfigurationManager.GetSection("YourSectionName") as YourConfigElement ;

一旦你有了你的配置元素,你可以随心所欲地做任何事情 - 你可以实现你要求的所有东西 - 检查一个元素的存在,获得一个特定的元素等。

您还应该查看Jon Rista关于CodeProject上.NET 2.0配置的三部分系列以获取更多信息 - 也许这些文章将帮助您解锁配置“挑战”; - )

强烈推荐,写得很好,非常有帮助!

如果你还没有发现它 - 在Codeplex上有一个很好的Configuration Section Designer,可以直观地设计配置部分和集合,并为你编写所有粘性代码 - 非常方便!

马克