Пользовательская конфигурация с несколькими вложенными коллекциями - PullRequest
0 голосов
/ 15 февраля 2019

Я знаю, что для этого уже есть много ответов, однако ни один из ответов, которые я прочитал, кажется не совсем тем, к которому я стремлюсь, когда я пытаюсь сопоставить примеры с тем, что яделаю, они не совсем правильно сидят.Так что терпите меня.

Я пытаюсь создать собственную вложенную конфигурацию для файла app.config в c #.Что мне нужно, так это:

<MyConfigurationSection>
    <CollectionA>
      <CollectionC Property1="Blah" Property2="123" >
        <CollectionD Property1="Achoo" Property2="Bless You">
            <Element Property1="Woo" Property2="Hoo" Property3="456" />
            <Element Property1="Oh" Property2="No" />
        </CollectionD>
        <CollectionD Property1="TaDa" Property2="HaHa!">
            <Element Property1="X" Property2="Y" />
        </CollectionD>
      </CollectionC>
    </CollectionA>
    <CollectionB>
        <CollectionC Property1="Boo" Property2="789">
            <CollectionD Property1="Test" Property2="ing">
                <Element Property1="Please" Property2="Help" />
            </CollectionD>
        </CollectionC>
    </CollectionB>
</MyConfigurationSection>

Я написал код для пользовательского раздела конфигурации, когда он был просто CollectionA и CollectionB с элементами, не проблема, но измененияТребуется в приложении означает, что мне нужно что-то более сложное.Любая помощь, или кто-нибудь, направьте меня в правильном направлении, пожалуйста?

Как я уже сказал, я смотрел на другие примеры, и все они, кажется, CollectionB, вложены в CollectionA в config раздел - который, кажется, просто не помогает мне, или, может быть, я просто неправильно что-то понимаю.

В конечном счете, я пытаюсь достичь, для collectionA, отобразить все CollectionC 's в объект, и каждый объект CollectionC имеет свои собственные свойства вместе с отображением объектов CollectionD (со списком Element).Затем повторите для CollectionB.

Для полноты, это была пользовательская сборка, которую я создал для нее, очевидно, она не работает, и я неохотно публиковал сообщения, так как чувствую, что до сих порс трека, это, вероятно, не стоило усилий.Но тем не менее, это здесь:

namespace my.app.namespace
{
    #region Configuration Section

    public class MyConfigurationSection : ConfigurationSection
    {
       public const string SectionName = "MyConfigurationSection";

       [ConfigurationProperty("CollectionA")]
       public CollectionA CollectionAItems
       {
           get { return ((CollectionA)(base["CollectionA"])); }
           set { base["CollectionA"] = value; }
       }

       [ConfigurationProperty("CollectionB")]
       public CollectionB CollectionBItems
       {
           get { return ((CollectionB)(base["CollectionB"])); }
           set { base["CollectionB"] = value; }
       }
    }

    #endregion Configuration Section

    #region Configuration Collections

    //CollectionA that wraps the CollectionC
    [ConfigurationCollection(typeof(ElementC))]
    public class CollectionA : ConfigurationElementCollection
    {

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

       protected override object GetElementKey(ConfigurationElement element)
       {
           return ((ElementC)element).Property1;
       }

       protected override string ElementName
       {
           get
           {
               return "CollectionA";
           }
       }

        [ConfigurationProperty("CollectionC")]
        public CollectionC CollectionCItems
        {
            get { return ((CollectionC)(base["CollectionC"])); }
            set { base["CollectionC"] = value; }
        }
    }

    //CollectionB that wraps CollectionC
    [ConfigurationCollection(typeof(ElementC))]
    public class CollectionB : ConfigurationElementCollection
    {
       protected override ConfigurationElement CreateNewElement()
       {
           return new ElementC();
       }

       protected override object GetElementKey(ConfigurationElement element)
       {
           return ((ElementC)element).Property1;
       }

       protected override string ElementName
       {
           get
           {
               return "CollectionB";
           }
       }

       [ConfigurationProperty("CollectionC")]
        public CollectionC CollectionCItems
        {
            get { return ((CollectionC)(base["CollectionC"])); }
            set { base["CollectionC"] = value; }
        }
    }

    //CollectionC that wraps CollectionD
    [ConfigurationCollection(typeof(ElementD))]
    public class CollectionC : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ElementD();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ElementD)element).Property1;
        }

        protected override string ElementName
        {
            get
            {
                return "CollectionC";
            }
        }

        [ConfigurationProperty("CollectionD")]
        public CollectionD CollectionDItems
        {
            get { return ((CollectionD)(base["CollectionD"])); }
            set { base["CollectionD"] = value; }
        }
    }

    #endregion Configuration Collections

    #region Configuration Elements

    //ElementC (element of CollectionC)
    class ElementC : ConfigurationElement
    {
       [ConfigurationProperty("Property1", DefaultValue = "", IsKey = true, IsRequired = true)]
       public string Property1
       {
           get { return (string)this["Property1"]; }
           set { this["Property1"] = value; }
       }

       [ConfigurationProperty("Property2", DefaultValue = "", IsKey = false, IsRequired = true)]
       public int Property2
       {
           get { return (int)this["Property2"]; }
           set { this["Property2"] = value; }
       }
    }

    //ElementD (element of CollectionD)
    class ElementD : ConfigurationElement
    {
       [ConfigurationProperty("Property1", DefaultValue = "", IsKey = true, IsRequired = true)]
       public string Property1
       {
           get { return (string)this["Property1"]; }
           set { this["Property1"] = value; }
       }

       [ConfigurationProperty("Property2", DefaultValue = "", IsKey = false, IsRequired = true)]
       public string Property2
       {
           get { return (string)this["Property2"]; }
           set { this["Property2"] = value; }
       }
    }

    //Element
    class Element : ConfigurationElement
    {
        [ConfigurationProperty("Property1", DefaultValue = "", IsKey = true, IsRequired = true)]
        public string Property1
        {
            get { return (string)this["Property1"]; }
            set { this["Property1"] = value; }
        }

        [ConfigurationProperty("Property2", DefaultValue = "", IsKey = false, IsRequired = true)]
        public string Property2
        {
            get { return (string)this["Property2"]; }
            set { this["Property2"] = value; }
        }

        [ConfigurationProperty("Property3", DefaultValue = "", IsKey = false, IsRequired = false)]
        public int Property3
        {
            get { return (int)this["Property3"]; }
            set { this["Property3"] = value; }
        }
    }

    #endregion Configuration Elements  
}

Естественно, что заголовок файла конфигурации содержит соответствующий раздел configSections:

<configSections>
    <section name="MyConfigurationSection" type="my.app.namespace.MyConfigurationSection, my.app.namespace" />
</configSections>

Для доступа к конфигурации яУ меня есть следующее:

//Fails on this line
var configSection = ConfigurationManager.GetSection(MyConfigurationSection.SectionName) as MyConfigurationSection;

foreach (CollectionA collectionAItems in configSection.CollectionAItems)
{
    //It doesn't even make it into this for each but essentially i'd iterate over collection C, and then each CollectionD in C, and then each Element in CollectionD
}

Как я уже сказал, я думаю, что я в довольно далеком от того, чего я пытаюсь достичь!Я пытался превратить CollectionA и CollectionB в их собственные configSections, чтобы немного разбить его, но также не добился большого прогресса в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...