2013-02-11 11 views
27

używam plik app.config, który jest tworzony z aplikacji konsoli i mogę odczytać VAL1 z key1 pomocą ConfigurationSettings.AppSettings["key1"].ToString()sub appSettings w węźle AppSetting C#

<startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> </startup> `

<add key="key1" value="val1" /> 
<add key="key2" value="val2" /> 

</appSettings> </configuration>

ale mam zbyt wiele kluczy i wartości, które chcę aby je sklasyfikować.

znalazłem coś, co jest trudne do wykorzystania w mojej aplikacji, ponieważ chcę, aby uzyskać dostęp do kluczy w sposób podobny do powyższego

Showing all nodes and can't read a node without getting all the nodes

na przykład to, co chcę zrobić:

<appSettings> 
<Section1> 
    <add key="key1" value="val1" /> 
</Section1> 
<Section2> 
    <add key="key1" value="val1" /> 
<Section2> 
</appSettings> 

i czy istnieje sposób uzyskać do niego dostęp za pomocą ConfigurationSettings.AppSettings["Section1"].["key1"].ToString()

Odpowiedz

57

Możesz dodać niestandardowe sekcje w app.config bez pisania dodatkowego kodu. Wszystko co musisz zrobić, to „oświadczenie” nowy rozdział w configSections węzła jak ten

<configSections> 
     <section name="genericAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
    </configSections> 

a następnie można określić tę sekcję wypełniając ją kluczy i wartości:

<genericAppSettings> 
     <add key="testkey" value="generic" /> 
     <add key="another" value="testvalue" /> 
    </genericAppSettings> 

Aby uzyskać wartość klucza z tej sekcji musisz dodać System.Configuration dll jako odniesienie do twojego projektu, dodać using i użyć metody GetSection. Przykład:

using System.Collections.Specialized; 
using System.Configuration; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      NameValueCollection test = (NameValueCollection)ConfigurationManager.GetSection("genericAppSettings"); 

      string a = test["another"]; 
     } 
    } 
} 

Dobrą rzeczą jest to, że można łatwo zrobić grup sekcjach jeśli potrzebujesz to:

<configSections> 
    <sectionGroup name="customAppSettingsGroup"> 
     <section name="genericAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
// another sections 
    </sectionGroup> 
</configSections> 

    <customAppSettingsGroup> 
    <genericAppSettings> 
     <add key="testkey" value="generic" /> 
     <add key="another" value="testvalue" /> 
    </genericAppSettings> 
    // another sections 
    </customAppSettingsGroup> 

Jeśli używasz grup, aby uzyskać dostęp do sekcji masz do nich dostęp przy użyciu formatu {group name}/{section name}:

NameValueCollection test = (NameValueCollection)ConfigurationManager.GetSection("customAppSettingsGroup/genericAppSettings"); 
+0

Aby wyjaśnić, "configSections" jest po prostu dzieckiem z węzła "konfiguracja": [MSDN] (https://msdn.microsoft.com/en-us/library/aa903350 (v = vs.71). aspx) – Alex

0

AFAIK y możesz zaimplementować niestandardową sekcję poza apozycjami. Na przykład frameworki takie jak Autofac i SpecFlow wykorzystują tego typu sesje do obsługi własnego schematu konfiguracji. Możesz zapoznać się z artykułem MSDN this, aby zrozumieć, jak to zrobić. Nadzieja, która pomaga.

+0

Będę używał nazwy sekcji przed każdą nazwą klucza, aby ją zmodyfikować i zachować wszystkie w jednym węźle (węzeł appSettings), ponieważ wydaje się, że trudno jest wykonać Dzięki –