Получение элемента конфигурации из ConfigurationElementCollection
Я (надеюсь) настроил ConfigurationElementCollection моего собственного дизайна с электронными письмами в качестве ключей. Что теперь? Трудно найти на самом деле в Интернете. Как я:
перебрать это?
Видите, существует ли конкретный элемент?
получить конкретный элемент?
...дано:
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 ответа
То, что вы хотите, это ваш собственный общий 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);
}
}
}
Приложив немного больше работы, вы также можете получить коллекцию словарей.
Я не совсем понимаю, какие у вас проблемы - но в принципе, если у вас есть пользовательский элемент конфигурации, вы сможете извлечь его из файла конфигурации, используя что-то вроде:
YourConfigElement config =
ConfigurationManager.GetSection("YourSectionName") as YourConfigElement ;
Если у вас есть элемент конфигурации, вы можете делать с ним все, что захотите - вы можете реализовать все, что вы просили - проверить наличие элемента, получить определенный элемент и т. Д.
Вам также следует ознакомиться с серией из трех статей о настройке.NET 2.0 в CodeProject Джона Риста, чтобы узнать больше - возможно, эти статьи помогут вам разблокировать ваш вызов "config";-)
- Раскрытие тайн конфигурации.NET 2.0
- Расшифровка загадок конфигурации.NET 2.0
- Раскрывая тайны конфигурации.NET 2.0
Настоятельно рекомендуется, хорошо написано и очень полезно!
И если вы еще этого не обнаружили - в Codeplex есть отличный дизайнер разделов конфигурации, который делает визуальное проектирование разделов и коллекций конфигурации проще простого и пишет для вас весь клейкий клейкий код - очень удобно!
Марк