5

我需要在我的自定义配置部分做这样的事情:

ConfigurationManager.ConnectionStrings["mongodb"]

上面的字符串“mongodb”是我用来访问 System.Configuration.ConnectionStringSettings 类型的 de 元素的键。我希望对我的自定义集合做同样的事情:

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

如何使用 ...Section.Questions[3] 访问第一个元素(id=3)(3 不是位置,而是键)?

4

4 回答 4

4

感谢 Aleksei Chepovoi 的建议。解决方法如下:

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

}
于 2013-10-11T11:45:58.413 回答
3

您可以强制此重载configurationElement通过其键检索项目:

public Question GetQuestion(int id)
{
    get
    {
       return (Question)this.BaseGet((object)id);
    }
}
于 2015-02-04T20:45:50.210 回答
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);
}
于 2013-10-11T06:30:14.483 回答
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);
    }

}
于 2014-12-16T04:48:33.470 回答