Как создать пользовательский раздел, который ведет себя как раздел AppSettings? - PullRequest
12 голосов
/ 19 сентября 2011

Я хочу иметь следующую структуру в моей конфигурации:

<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 ]

8 голосов
/ 20 сентября 2011

Это сработало -
Код:

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

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

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

2 голосов
/ 19 сентября 2011

Вы должны создать класс, производный от ConfigurationSection

, см. Полный пример здесь: Как: создать пользовательские разделы конфигурации с помощью ConfigurationSection

...