2013-10-11 36 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); 
    } 
}