【问题标题】:How to retrieve ConfigurationElement using key (array key access) in ConfigurationCollection?如何使用 ConfigurationCollection 中的键(数组键访问)检索 ConfigurationElement?
【发布时间】:2013-10-19 00:18:39
【问题描述】:

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

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 不是位置,而是键)?

【问题讨论】:

    标签: c# asp.net arrays configuration indexing


    【解决方案1】:
    [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);
        }
    
    }
    

    【讨论】:

    • 如果不想使用Linq,可以使用BaseGet
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      感谢 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);
              }
          }
      
      }
      

      【讨论】:

      • 索引器的签名应该是:public new Question this[int id]?
      【解决方案4】:

      我假设您的自定义配置部分的名称是 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);
      }
      

      【讨论】:

      • 嗯...我有那个代码,但我仍然无法通过 key customConfigSection.Questions[].Id 访问;
      • @LucasBatistussi,您的意思是您想获取 id 为“3”的元素?
      • 是的!这就是我想要的:)
      • 嗯...我得到了一个丑陋的解决方案....我在 QuestionCollection 类中做了以下内容: public Question this[string idx] { get { object[] keys = this.BaseGetAllKeys(); int IDX = int.Parse(idx); foreach(keys 中的对象 i){ if (IDX == (int)i) { return BaseGet(i) as Question; } } 返回空值; } }
      • 你有更优雅的解决方案吗? ASP.NET 是否有默认方式来执行此操作?
      猜你喜欢
      • 2022-01-03
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多