Получение элемента конфигурации из ConfigurationElementCollection - PullRequest
7 голосов
/ 06 мая 2010

У меня (надеюсь) есть настройка ConfigurationElementCollection моего собственного дизайна с электронными письмами в качестве ключей. Что теперь? Трудно найти на самом деле в Интернете. Как мне:

  1. перебрать его?

  2. Проверьте, существует ли конкретный элемент?

  3. получить конкретный элемент?

... Дано:

    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 ]

8 голосов
/ 02 июля 2010

То, что вы хотите, - это ваш собственный базовый класс 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);
        }
    }
}

Приложив немного больше работы, вы также можете получить словарную коллекцию.

2 голосов
/ 07 мая 2010

Я не совсем понимаю, в чем заключаются ваши проблемы, но, в принципе, если у вас есть пользовательский элемент конфигурации, вы сможете получить его из файла конфигурации, используя что-то вроде:

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

Когда у вас есть элемент конфигурации, вы можете делать с ним все что угодно - вы можете реализовать все, что вы просили - проверить наличие элемента, получить определенный элемент и т. Д.

Вам также следует ознакомиться с серией из трех частей Джона Риста о настройке .NET 2.0 в CodeProject для получения дополнительной информации - возможно, эти статьи помогут вам разблокировать ваш вызов «config»;

Настоятельно рекомендуется, хорошо написано и чрезвычайно полезно!

А если вы еще этого не обнаружили - есть отличный Дизайнер разделов конфигурации в Codeplex, который делает визуальное проектирование разделов и коллекций конфигурации проще простого и пишет весь клейкий код для вас - очень удобно в самом деле!

Марк

...