Как создать пользовательский раздел, который ведет себя как раздел AppSettings?
Я хочу иметь следующую структуру в моей конфигурации:
<MySection>
<add key="1" value="one" />
<add key="2" value="two" />
<add key="3" value="three" />
</MySection>
У меня есть такое ограничение, что MySection не может использовать AppSettingsSection, поскольку он должен наследовать от другого родительского пользовательского раздела. И мне нужно разрешить этот раздел в NameValueCollection, чтобы при вызове что-то вроде:
ConfigurationManager.GetConfig("MySection")
он должен вернуть NameValueCollection. Как это сделать? Я нашел некоторую информацию о NameValueConfigurationCollection, но это не то, что я ищу.
2 ответа
Это сработало -
Код:
class Program
{
static void Main(string[] args)
{
NameValueCollection nvc = ConfigurationManager.GetSection("MyAppSettings") as NameValueCollection;
for(int i=0; i<nvc.Count; i++)
{
Console.WriteLine(nvc.AllKeys[i] + " " + nvc[i]);
}
Console.ReadLine();
}
}
class ParentSection : ConfigurationSection
{
//This may have some custom implementation
}
class MyAppSettingsSection : ParentSection
{
public static MyAppSettingsSection GetConfig()
{
return (MyAppSettingsSection)ConfigurationManager.GetSection("MyAppSettings");
}
[ConfigurationProperty("", IsDefaultCollection = true)]
public NameValueConfigurationCollection Settings
{
get
{
return (NameValueConfigurationCollection)base[""];
}
}
}
Конфигурация:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<!-- <section name="MyAppSettings" type="CustomAppSettings.MyAppSettingsSection, CustomAppSettings"/> -->
<section name="MyAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</configSections>
<MyAppSettings>
<add key="1" value="one"/>
<add key="2" value="two"/>
<add key="3" value="three"/>
<add key="4" value="four"/>
</MyAppSettings>
</configuration>
Моя главная проблема заключалась в том, что мой раздел должен наследоваться от пользовательского раздела, и я хотел вернуть коллекцию NameValueCollection при вызове ConfigurationManager.GetSection("MyAppSettings").
Я изменил свойство типа на AppSettingsSection, хотя его нигде нет на картинке, и это сработало. Теперь мне нужно выяснить, как это работает, но сейчас хорошо, что у меня есть рабочий образец:)
Обновление: К сожалению, это не был ожидаемый способ достижения того, что было задумано, потому что теперь пользовательский раздел вообще не входит в картину, так что, к сожалению, это не лучший способ сделать это.
Конечно, если вы просто хотите переименовать раздел appsettings, это будет работать как шарм.
Вы должны создать класс, который происходит от ConfigurationSection
см. полный пример здесь: Как создать пользовательские разделы конфигурации с помощью Configuration Section