2017-05-11 1 views
0

J'ai fait un petit paramètre de configuration personnalisé et je continue à recevoir l'erreur "L'entrée" a déjà été ajoutée. " quand j'essaie d'utiliser ma collection personnalisée. Mon code ressemble à ceci.Configuration personnalisée C#: "L'entrée" a déjà été ajoutée. "

Le problème provient de mon tag.

Je ne vois pas ce qui me manque puisque j'ai la même chose implémentée et celle-ci fonctionne parfaitement.

Ma version .NET est 4.0 si cela aide.

La section de configuration de l'application en question:

<WorkersCollectionSection> 
<WorkersList> 
    <Worker name="Category" isEnabled="false" 
     assemblyNamespace="xxxxxx.xxxxxxxxxxxxxxx.Models.Category" 
     queueName="CategorQueue" 
     saveToFolder="false"> 
    <HandlesList> 
     <Handle name="xxxxxxx" isEnabled="true"/> 
     <Handle name="yyyyyyy" isEnabled="true"/> 
     <Handle name="zzzzzzzzzz" isEnabled="true"/> 
    </HandlesList> 
    </Worker> 
<WorkersList> 
<WorkersCollectionSection> 

La définition de la propriété:

[ConfigurationProperty("HandlesList")] 
    [ConfigurationCollection(typeof(WorkerCollection), AddItemName = "Handle")] 
    public HandleCollection HandleCollection 
    { 
     get { return (HandleCollection) base["HandlesList"]; } 
    } 

Le code pour le tag: `public class HandleCollection: ConfigurationElementCollection, IEnumerable {

public HandleCollection() 
    { 
     HandleElement handle = (HandleElement)CreateNewElement(); 
     BaseAdd(handle); 
    } 

    public override ConfigurationElementCollectionType CollectionType 
    { 
     get { return ConfigurationElementCollectionType.AddRemoveClearMap; } 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new HandleElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((HandleElement)element).Name; 
    } 

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

    public new HandleElement this[string Name] 
    { 
     get { return (HandleElement)BaseGet(Name); } 
    } 

    public int IndexOf(HandleElement handle) 
    { 
     return BaseIndexOf(handle); 
    } 

    public void Add(HandleElement url) 
    { 
     BaseAdd(url); 
    } 

    protected override void BaseAdd(ConfigurationElement element) 
    { 
     BaseAdd(element, false); 
    } 

    public void Remove(HandleElement handle) 
    { 
     if (BaseIndexOf(handle) >= 0) 
      BaseRemove(handle); 
    } 

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

    public void Remove(string name) 
    { 
     BaseRemove(name); 
    } 

    public void Clear() 
    { 
     BaseClear(); 
    } 

    IEnumerator<ConfigurationElement> IEnumerable<ConfigurationElement>.GetEnumerator() 
    { 
     return (from i in Enumerable.Range(0, this.Count) 
       select this[i]) 
      .GetEnumerator(); 
    } 

    protected override string ElementName 
    { 
     get { return "Handle"; } 
    } 

    public static explicit operator HandleCollection(Dictionary<string, string> v) 
    { 
     throw new NotImplementedException(); 
    } 

    public static explicit operator HandleCollection(ConfigurationSection v) 
    { 
     throw new NotImplementedException(); 
    } 
}` 

Code pour les éléments de poignée dans côté de la liste:

public class HandleElement: ConfigurationElement 
{ 
    [ConfigurationProperty("name", IsRequired = true)] 
    [StringValidator(InvalidCharacters = "[email protected]#$%^&*()[]{}/;'\"|\\", MinLength = 0, MaxLength = 60)] 
    public string Name 
    { 
     get { return base["name"] as string; } 
     set { base["name"] = value; } 
    } 

    [ConfigurationProperty("isEnabled", IsRequired = true)] 
    public bool IsEnabled 
    { 
     get { return (bool)base["isEnabled"]; } 
     set { base["isEnabled"] = value; } 
    } 

} 
+0

Dans la section '' de votre config, le premier élément a deux parenthèses d'ouverture: '<< Handle name =" RabbitMQHandle "isEnabled =" true "/> ' – krillgar

+0

C'est un tipo. Ma faute. – BigBadCoder

+0

avez-vous enregistré votre section de configuration personnalisée dans le fichier app.config avant de l'ajouter –

Répondre

0

Il semble que la question était que je ne l'ai pas mis un chèque dans la méthode en ajoutant la collecte pour vérifier si l'élément que je suis d'ajouter a une clé différente de celle du vide. J'ai changé mon constructeur de collection à:

public HandleCollection() 
    { 
     HandleElement handle = (HandleElement)CreateNewElement(); 
     if (handle.Name != "") 
      BaseAdd(handle); 
    } 

Maintenant, il semble bien fonctionner.