2017-05-11 51 views
0

小さなカスタム設定を行いましたが、「このエントリは既に追加されています」というエラーが表示され続けます。カスタムコレクションを使用しようとすると私のコードはこのように見えます。C#カスタム設定: "エントリ ''は既に追加されています。

問題は私のタグに由来します。

同じことが実装されていて、これが完全に機能するので、私は何が欠けているのかわかりません。

.NETのバージョンが4.0の場合はそれが役に立ちます。

当該アプリの設定セクション:

<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> 

性の定義:

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

タグのコード: `パブリッククラス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(); 
    } 
}` 

のハンドル要素のコード側リスト:

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

あなたの設定の ''セクションでは、最初の要素に2つの角カッコがあります: 'Handle name =" RabbitMQHandle "isEnabled =" true "/> ' – krillgar

+0

これはヒントです。私の悪い。 – BigBadCoder

+0

カスタム設定セクションを追加する前にapp.configファイルに登録しましたか? –

答えて

0

問題は、私は追加してい要素が空のものとは異なる鍵を持っているかどうかを確認するためにメソッドを追加するコレクションにチェックを入れていないということだったようです。私はコレクションコンストラクタを次のように変更しました:

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

これはうまくいくようです。

関連する問題