단순한 add
요소 목록 인 사용자 지정 app.config 섹션을 만들려면 어떻게해야 합니까?
다음과 같은 사용자 지정 섹션에 대한 몇 가지 예 (예 : app.config에서 사용자 지정 구성 섹션을 만드는 방법? )를 찾았습니다.
<RegisterCompanies>
<Companies>
<Company name="Tata Motors" code="Tata"/>
<Company name="Honda Motors" code="Honda"/>
</Companies>
</RegisterCompanies>
그러나 추가 수집 요소 ( “Companies”)를 피하여 appSettings
및 connectionStrings
섹션 과 동일하게 보이도록하려면 어떻게해야 합니까? 즉, 다음을 원합니다.
<registerCompanies>
<add name="Tata Motors" code="Tata"/>
<add name="Honda Motors" code="Honda"/>
</registerCompanies>
답변
OP 구성 파일을 기반으로하는 코드가있는 전체 예제 :
<configuration>
<configSections>
<section name="registerCompanies"
type="My.MyConfigSection, My.Assembly" />
</configSections>
<registerCompanies>
<add name="Tata Motors" code="Tata"/>
<add name="Honda Motors" code="Honda"/>
</registerCompanies>
</configuration>
다음은 축소 된 컬렉션이있는 사용자 지정 구성 섹션을 구현하는 샘플 코드입니다.
using System.Configuration;
namespace My {
public class MyConfigSection : ConfigurationSection {
[ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)]
public MyConfigInstanceCollection Instances {
get { return (MyConfigInstanceCollection)this[""]; }
set { this[""] = value; }
}
}
public class MyConfigInstanceCollection : ConfigurationElementCollection {
protected override ConfigurationElement CreateNewElement() {
return new MyConfigInstanceElement();
}
protected override object GetElementKey(ConfigurationElement element) {
//set to whatever Element Property you want to use for a key
return ((MyConfigInstanceElement)element).Name;
}
}
public class MyConfigInstanceElement : ConfigurationElement {
//Make sure to set IsKey=true for property exposed as the GetElementKey above
[ConfigurationProperty("name", IsKey = true, IsRequired = true)]
public string Name {
get { return (string) base["name"]; }
set { base["name"] = value; }
}
[ConfigurationProperty("code", IsRequired = true)]
public string Code {
get { return (string) base["code"]; }
set { base["code"] = value; }
} } }
다음은 코드에서 구성 정보에 액세스하는 방법의 예입니다.
var config = ConfigurationManager.GetSection("registerCompanies")
as MyConfigSection;
Console.WriteLine(config["Tata Motors"].Code);
foreach (var e in config.Instances) {
Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code);
}
답변
사용자 지정 구성 섹션이 필요하지 않습니다.
App.Config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="YourAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</configSections>
<!-- value attribute is optional. omit if you just want a list of 'keys' -->
<YourAppSettings>
<add key="one" value="1" />
<add key="two" value="2"/>
<add key="three" value="3"/>
<add key="duplicate" value="aa"/>
<add key="duplicate" value="bb"/>
</YourAppSettings>
</configuration>
검색
// This casts to a NameValueCollection because the section is defined as a
/// AppSettingsSection in the configSections.
NameValueCollection settingCollection =
(NameValueCollection)ConfigurationManager.GetSection("YourAppSettings");
var items = settingCollection.Count;
Debug.Assert(items == 4); // no duplicates... the last one wins.
Debug.Assert(settingCollection["duplicate"] == "bb");
// Just keys as per original question? done... use em.
string[] allKeys = settingCollection.AllKeys;
// maybe you did want key/value pairs. This is flexible to accommodate both.
foreach (string key in allKeys)
{
Console.WriteLine(key + " : " + settingCollection[key]);
}
답변
위 의 Jay Walker의 답변을 기반으로 , 이것은 인덱싱을 수행하는 기능을 추가하는 완전한 작업 예제입니다.
<configuration>
<configSections>
<section name="registerCompanies"
type="My.MyConfigSection, My.Assembly" />
</configSections>
<registerCompanies>
<add name="Tata Motors" code="Tata"/>
<add name="Honda Motors" code="Honda"/>
</registerCompanies>
</configuration>
다음은 축소 된 컬렉션이있는 사용자 지정 구성 섹션을 구현하는 샘플 코드입니다.
using System.Configuration;
using System.Linq;
namespace My
{
public class MyConfigSection : ConfigurationSection
{
[ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)]
public MyConfigInstanceCollection Instances
{
get { return (MyConfigInstanceCollection)this[""]; }
set { this[""] = value; }
}
}
public class MyConfigInstanceCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new MyConfigInstanceElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
//set to whatever Element Property you want to use for a key
return ((MyConfigInstanceElement)element).Name;
}
public new MyConfigInstanceElement this[string elementName]
{
get
{
return this.OfType<MyConfigInstanceElement>().FirstOrDefault(item => item.Name == elementName);
}
}
}
public class MyConfigInstanceElement : ConfigurationElement
{
//Make sure to set IsKey=true for property exposed as the GetElementKey above
[ConfigurationProperty("name", IsKey = true, IsRequired = true)]
public string Name
{
get { return (string)base["name"]; }
set { base["name"] = value; }
}
[ConfigurationProperty("code", IsRequired = true)]
public string Code
{
get { return (string)base["code"]; }
set { base["code"] = value; }
}
}
}
다음은 코드에서 구성 정보에 액세스하는 방법의 예입니다.
MyConfigSection config =
ConfigurationManager.GetSection("registerCompanies") as MyConfigSection;
Console.WriteLine(config.Instances["Honda Motors"].Code);
foreach (MyConfigInstanceElement e in config.Instances)
{
Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code);
}
답변
Jay Walker의 답변에 따라 “Instances”컬렉션을 반복하여 요소에 액세스해야합니다. 즉.
var config = ConfigurationManager.GetSection("registerCompanies")
as MyConfigSection;
foreach (MyConfigInstanceElement e in config.Instances) {
Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code);
}