2010-05-06 15 views
7

J'ai (j'espère) configuré ConfigurationElementCollection de ma propre conception avec des emails comme clés. Maintenant quoi? Difficile à trouver réellement sur le web. Comment puis-je:Obtenir l'élément config à partir de ConfigurationElementCollection

  1. de parcourir?

  2. Voir si un élément spécifique existe?

  3. obtenir un élément spécifique?

... donné:

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

réponse partielle

1.

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

2. remplacer «code ici» par

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

3. remplacer «code ici» par

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

Odeur minuscule.

Répondre

2

Je ne pas tout à fait comprendre ce que vos questions sont - mais fondamentalement, si vous avez un élément de configuration personnalisée, vous devriez être en mesure de récupérer ce à partir du fichier de configuration en utilisant quelque chose comme:

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

Une fois que vous avoir votre élément de configuration, vous pouvez en faire ce que vous voulez - vous pouvez implémenter tout ce que vous avez demandé - vérifier l'existence d'un élément, obtenir un élément spécifique, etc.

Vous devriez aussi jeter un coup d'œil aux trois parties de Jon Rista série sur la configuration .NET 2.0 sur CodeProject pour plus d'informations - peut-être que ces articles vous aideront à débloquer ur config "challenge" ;-)

Hautement recommandé, bien écrit et très utile! Et si vous ne l'avez pas encore découvert, il existe un excellent Configuration Section Designer sur Codeplex qui vous permet de créer visuellement des sections de configuration et des collections et d'écrire tout le code de colle gluant pour vous - très pratique!

Marc

+0

Merci pour votre réponse. La partie difficile pour moi est les types de collection. J'ai résolu # 1 mais il semble qu'il devrait y avoir un moyen plus joli et plus rapide si vous cherchez une clé. Je vais vérifier vos liens. – Martin

+1

Je suis en fait assez amusé. Les pages que vous suggérez ne sont pas les premières du contenu similaire que j'ai visité. Maintenant, je suis compétent dans la définition des types de collection, en ajoutant des éléments dans la configuration, tout en utilisant la collection dans mon code. Il expose la méthode AsQueryable(). Je suis sûr que c'est un indice, mais le queryable à son tour n'expose rien d'utilisation - get ou contains, par exemple. – Martin

8

Ce que vous voulez est votre propre classe de base ConfigurationElementCollection générique qui implémente IList<T>. Vous pouvez ensuite en hériter pour toutes vos collections de configuration et réduire la quantité de travail à effectuer lors de la création de collections de configuration.

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

Avec un peu plus de travail, vous pouvez également avoir une collection de dictionnaires.