2013-10-11 77 views
4

我需要做這樣的事情在我的自定義配置部分:如何使用ConfigurationCollection中的鍵(數組鍵)訪問檢索ConfigurationElement?

ConfigurationManager.ConnectionStrings["mongodb"] 

字符串「MongoDB的」以上是我使用的訪問類型System.Configuration.ConnectionStringSettings的德元素的關鍵。我希望做同樣與我的自定義集合:

[ConfigurationCollection(typeof(Question))] 
public class QuestionCollection : ConfigurationElementCollection 
{ 

    public override bool IsReadOnly() 
    { 
     return false; 
    } 

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

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((Question)element).id; 
    } 

    //Is here? 
    public Question this[int idx] 
    { 
     get { 
      return (Question)BaseGet(idx); 
     } 

     set 
     { 
      if (BaseGet(idx) != null) 
       BaseRemoveAt(idx); 

      BaseAdd(idx, value); 
     } 
    } 

} 

我想知道這種方法評價上面得到我想要的東西的方式......但我不知道該怎麼....類型的我想用來訪問的鍵是整數。

假設我具有以下配置:

<securityQuestions> 
    <questions> 
     <add id="3" value="What is your name?" default="true"/> 
     <add id="4" value="What is your age?"/> 
    </questions> 
</securityQuestions> 

如何訪問的第一個元素(ID = 3),... Section.Questions [3](3不是位置,但關鍵)?

回答

1

我假設您的自定義配置節的名稱是SecurityQuestionsSection

而且我認爲你有這樣的代碼:

public class SecurityQuestionsSection: ConfigurationSection 
{ 
    [ConfigurationProperty("questions", IsRequired = true, IsDefaultCollection = true)] 
    public QuestionCollection Questions 
    { 
     get 
     { 
      return (QuestionCollection)base["questions"]; 
     } 
    } 
} 

如果是這樣,你可以寫這樣的事情:

var customConfigSection = (SecurityQuestionsSection)ConfigurationManager 
             .GetSection("securityQuestionsSection"); 

var firstElementId = customConfigSection.Questions[0].Id; 

希望這有助於!

編輯:通過它的密鑰訪問配置元素您有兩個選項。

1)你可以使用LINQ外部類:

var elementWithIdOfThree = customConfigSection.Questions 
            .FirstOrDefault(item => item.Id == 3); 

2),也可以爲它添加一個方法來你QuestionCollection類,像這樣:

public Question GetQuestionWithId(int id) 
{ 
    return this.FirstOrDefault(item => item.Id == id); 
} 
+0

嗯......我有一個代碼,但我仍然可以」通過關鍵字customConfigSection.Questions []進行訪問。 –

+1

@LucasBatistussi,你的意思是你想獲得ID爲「3」的元素例如? –

+0

是的!這就是我想要的:) –

4

感謝阿列克謝Chepovoi爲sugestions。該解決方案如下:

[ConfigurationCollection(typeof(Question))] 
public class QuestionCollection : ConfigurationElementCollection 
{ 

    public override bool IsReadOnly() 
    { 
     return false; 
    } 

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

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((Question)element).id; 
    } 

    public Question this[int id] 
    { 
     get 
     { 
      return this.OfType<Question>().FirstOrDefault(item => item.id == id); 
     } 
    } 

} 
+0

如果索引器的簽名是: public new Question this [int id]? –

0
[ConfigurationCollection(typeof(Question))] 
public class QuestionCollection : ConfigurationElementCollection 
{ 

    public override bool IsReadOnly() 
    { 
     return false; 
    } 

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

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((Question)element).id; 
    } 

    public Question GetQuestion(int id) 
    { 
     return (Question)this.BaseGet(id); 
    } 

} 
+0

如果你不想使用Linq,你可以使用BaseGet – WoodsLink

3

您可以強制該超載檢索configurationElement項目的關鍵:

public Question GetQuestion(int id) 
{ 
    get 
    { 
     return (Question)this.BaseGet((object)id); 
    } 
}