Я знаю, что для этого уже есть много ответов, однако ни один из ответов, которые я прочитал, кажется не совсем тем, к которому я стремлюсь, когда я пытаюсь сопоставить примеры с тем, что яделаю, они не совсем правильно сидят.Так что терпите меня.
Я пытаюсь создать собственную вложенную конфигурацию для файла 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
, чтобы немного разбить его, но также не добился большого прогресса в этом.