2010-05-06 13 views
7

Tengo (con suerte) la configuración de ConfigurationElementCollection de mi propio diseño con los correos electrónicos como claves. ¿Ahora que? Difícil de encontrar en realidad en la web. ¿Cómo puedo:Obtener el elemento de configuración de ConfigurationElementCollection

  1. iterar a través de él?

  2. ¿Ves si un elemento específico existe?

  3. ¿Conseguir un elemento específico?

... dada:

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

respuesta parcial

1.

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

2. reemplace el "código aquí" con

{ 
    if (x.Y == needle) 
    { 
     hasIndeed = true; 
     break; 
    } 
} 

3. reemplace el "código aquí" con

{ if (x.Y == needle) 
     cameUpWith = x; 
     break; 
} 

Tiny olor.

Respuesta

2

No entiendo totalmente lo que sus problemas son - pero básicamente, si usted tiene un elemento de configuración personalizada, debe ser capaz de recuperar que desde el archivo de configuración usando algo como:

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

Una vez que tiene su elemento de configuración, puede hacer con él lo que quiera, puede implementar todas las cosas que solicitó, verificar la existencia de un elemento, obtener un elemento específico, etc.

También debe consultar las tres partes de Jon Rista serie sobre la configuración .NET 2.0 en CodeProject para más información - tal vez esos artículos te ayuden a desbloquear ur config "desafío" ;-)

Muy recomendable, bien escrito y muy útil!

Y si aún no lo ha descubierto, existe una excelente Configuration Section Designer en Codeplex que hace que el diseño visual de las secciones de configuración y colecciones sea muy sencillo y escribe todo el código de pegamento pegajoso para usted, ¡muy práctico!

Marc

+0

Gracias por su respuesta. La parte difícil para mí son los tipos de colección. He resuelto el # 1 pero parece que debería haber una manera más bonita y rápida si estás buscando una clave. Verificare tus enlaces. – Martin

+1

En realidad estoy bastante divertido. Las páginas que sugiere no son las primeras de contenido similar que he visitado. Ahora soy experto en definir tipos de colección, agregando elementos en la configuración, todos menos en realidad usando la colección en mi código. Expone el método AsQueryable(). Estoy seguro de que es una pista, pero la consulta a su vez no expone nada de uso, por ejemplo, obtener o contener. – Martin

8

Lo que se quiere es su propia clase genérica ConfigurationElementCollection base que implementa IList<T>. A continuación, puede heredar esto para todas sus colecciones de configuración y reducir la cantidad de trabajo que necesita hacer al crear colecciones de configuración.

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); 
     } 
    } 
} 

Con un poco más de trabajo puede tener una colección de diccionario también.

Cuestiones relacionadas