2008-12-03 14 views
59

Me gustaría almacenar un diccionario simple de cadena de clave/valor en mi archivo de configuración web. Visual Studio facilita la tarea de almacenar una colección de cadenas (ver el ejemplo a continuación) pero no estoy seguro de cómo hacerlo con una colección de diccionarios.¿Cómo guardo un objeto de diccionario en mi archivo web.config?

 <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
      <string>value1</string> 
      <string>value2</string> 
      <string>value2</string> 
     </ArrayOfString> 

Respuesta

113

¿Por qué reinventar la rueda? La sección AppSettings está diseñada con el propósito exacto de almacenar datos tipo diccionario en su archivo de configuración.

Si no quiere poner demasiados datos en su sección de AppSettings, puede agrupar sus valores relacionados en su propia sección de la siguiente manera:

<configuration> 
    <configSections> 
    <section 
     name="MyDictionary" 
     type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </configSections> 

    <MyDictionary> 
    <add key="name1" value="value1" /> 
    <add key="name2" value="value2" /> 
    <add key="name3" value="value3" /> 
    <add key="name4" value="value4" /> 
    </MyDictionary> 
</configuration> 

Se puede acceder a los elementos de esta colección usando

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

public string GetName1() 
{ 
    NameValueCollection section = 
     (NameValueCollection)ConfigurationManager.GetSection("MyDictionary"); 
    return section["name1"]; 
} 
+0

Esto es lo que necesitaba. Ahora, siendo un programador de VB me gustaría acceder a la parte de MySettings de la web.config! – TGnat

+0

@TGnat, ¿tiene mis ajustes en los proyectos web? Yo no. En winform-projects, la app.config y my.settings están sincronizadas entre sí, creo. – Stefan

+0

Sí, la copia del código que incluí en la pregunta se copió de un Mi.Configuración en web.config. – TGnat

5

Debería implementar una sección personalizada (Consulte Configuration Section Designer).

Lo que realmente quiere ... es algo parecido a esto:

<MyDictionary> 
    <add name="Something1" value="something else"/> 
    <add name="Something2" value="something else"/> 
    <add name="Something3" value="something else"/> 
</MyDictionary> 

Cuando el "nombre" XmlAttribute es una llave que no va a permitir tener más de uno en el código subyacente. Al mismo tiempo, asegúrese de que la Colección MyDictionary sea también un Diccionario.

Puede hacer todo esto con esta herramienta y llenar el vacío según sea necesario.

+0

¿No puede usar el atributo de clave en lugar del nombre? Sé que tengo un par de ellos en la sección de aplicaciones para algunas variables que uso en el sitio web. – Stefan

0

No estoy seguro de cómo almacenar un diccionario directamente pero podría usar fácilmente una matriz de cadenas para almacenar un diccionario. Para cada clave, par de valores, guarda la clave como la primera cadena y el valor como la segunda. Luego, al reconstruir el diccionario, puede deshacer esta codificación.

static Dictionary<string,string> ArrayToDictionary(string[] data) { 
    var map = new Dictionary<string,string>(); 
    for (var i= 0; i < data.Length; i+=2) { 
    map.Add(data[i], data[i+1]); 
    } 
    return map; 
} 
23

respuesta de Julieta es el punto, pero su información también puede poner configuraciones adicionales en .config archivos externos, mediante la creación de su web.config de la siguiente manera:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <!-- blah blah the default stuff here --> 

    <!-- here, add your custom section --> 
    <section name="DocTabMap" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </configSections> 

    <!-- your custom section, but referenced in another file --> 
    <DocTabMap file="CustomDocTabs.config" /> 

    <!-- etc, remainder of default web.config is here --> 
</configuration> 

Entonces, su CustomDocTabs.config se parece a esto:

<?xml version="1.0"?> 
<DocTabMap> 
    <add key="A" value="1" /> 
    <add key="B" value="2" /> 
    <add key="C" value="3" /> 
    <add key="D" value="4" /> 
</DocTabMap> 

Ahora se puede acceder a él en el código a través de:

NameValueCollection DocTabMap = ConfigurationManager.GetSection("DocTabMap") as NameValueCollection; 
DocTabMap["A"] // == "B" 
+1

Este es un excelente punto. Un cambio, sin embargo, es que en lugar de especificar el atributo "archivo" solo pude hacer que funcionara con el atributo "configSource". p.ej.

3

En configuración de la aplicación podemos utilizar System.Collection.Specilized.StringCollection

<X.Properties.Settings> 
    <setting name="ElementsList" serializeAs="Xml"> 
    <value> 
     <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <string>Element1</string> 
     <string>Element2</string> 
     </ArrayOfString> 
    </value> 
    </setting> 
</X.Properties.Settings> 

Acceso a la lista:

var element = Settings.Default.ElementsList[index] 
+2

Esto no es un diccionario. – Cody

Cuestiones relacionadas