2009-11-18 11 views
12

he intentadoC# AppSettings: ¿Hay una manera fácil de poner en una colección <appSetting>

<appSettings > 
    <add key="List" value="1"/> 
    <add key="List" value="2"/> 
    <add key="List" value="3"/> 
    </appSettings > 

y System.Configuration.ConfigurationManager.AppSettings.GetValues("List");

Pero solo me dan el último miembro. ¿Cómo podría resolver esto fácilmente?

+2

solución más sencilla es utilizar [System.Collections.Specialized.StringCollection] (http://msdn.microsoft.com/en-us/library /system.collections.specialized.stringcollection.aspx): Respondido para la pregunta: [Store String Array In appSettings?] (http://stackoverflow.com/q/10419116/155207) – Serkan

Respuesta

24

He tratado un problema similar y lo hice con este código. Espero que esto ayude en tu problema.

En este caso, List (similar a mi URLSection) tendrá una sección de configuración completa en web.config de la que puede obtener todos los valores de esta sección.

<configSections> 
    <section name="URLSection" type="A.WebConfigSection,A,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"/> 
</configSections> 

<appSettings></appSettings> 

<URLSection> 
    <urlCollection> 
     <add url="1" value="a"/> 
     <add url="2" value="b"/> 
    </urlCollection> 
</URLSection> 

Hice tres clases para esto: ConfigElement, ConfigElementCollection, WebConfigSection.

ConfigElement

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Configuration; 

namespace A 
{ 
    public class ConfigElement:System.Configuration.ConfigurationElement 
{ 
    [ConfigurationProperty("url",IsRequired=true) ] 
    public string url 
    { 
     get 
     { 
      return this["url"] as string; 
     } 
    } 

    [ConfigurationProperty("value", IsRequired = true)] 
    public string value 
    { 
     get 
     { 
      return this["value"] as string; 
     } 
    } 



    } 
} 

ConfigElementCollection

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Configuration; 

namespace A 
{ 
    public class ConfigElementCollection:ConfigurationElementCollection 
{ 
    public ConfigElement this[int index] 
    { 
     get 
     { 
      return base.BaseGet(index) as ConfigElement; 
     } 

    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new ConfigElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((ConfigElement)(element)).url; 
    } 
} 
} 

WebConfigSection

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Configuration; 

namespace A 
{ 
public class WebConfigSection:ConfigurationSection 
{ 

    public WebConfigSection() 
    { 

    } 

    [ConfigurationProperty("urlCollection")] 
    public ConfigElementCollection allValues 
    { 
     get 
     { 
      return this["urlCollection"] as ConfigElementCollection; 
     } 
    } 

    public static WebConfigSection GetConfigSection() 
    { 
     return ConfigurationSettings.GetConfig("URLSection") as WebConfigSection; 
    } 
} 
} 
+0

cosa muy interesante voy a intentar esto y puede pedir ayuda si no lo consigo – Markus

+0

Probé esto pero lo hago funciona me sale este error: Al crear la sección de configuración controlador para "URLSection" Se ha producido un error .: El archivo o ensamblado "A, Ve rsion = 1.0.0.0, Culture = neutral, PublicKeyToken = null 'o una de sus dependencias no se encontró Pero ¿por qué? Acabo de copiar tu código – Markus

+1

Markus Cambié el nombre del Espacio de nombres (A) en este código, ya que representaba algunas cosas relacionadas con la empresa en la que trabajo. Por lo tanto, es posible que no puedas construir tu código, pero este diseño puedes encontrar en este link: http://msdn.microsoft.com/en-us/library/2tw134k3.aspx –

1

Es mejor que coloque esta información en un archivo XML separado y que tenga una referencia a ese archivo en AppSettings. Eso le daría mucha más flexibilidad sobre cómo recuperó la información y la consumió.

Lo único que desea es crear una clase separada (¿estática?) Para leer el XML de forma similar a la clase System.Configuration.ConfigurationManager.AppSettings.

Si, por otro lado, TENÍA que estar en su archivo Web.Config, sugeriría que la única manera de lograr esto sería simplemente tener una matriz delimitada [tubería/coma/punto y coma] en una Configuración "Lista".

+0

: S sux, creo que debe haber simular a las colecciones en una aplicación normal.Config etiqueta – Markus

1

Haacked p proporciona un enfoque conciso a los ajustes de configuración. Su enfoque utiliza una clase derivada de ConfigurationSection. Así, por ejemplo, su blog de su app.config o web.config representación XML tendrá un aspecto como este:

<configuration> 
    <configSections> 
    <section name="BlogSettings" type="Fully.Qualified.TypeName.BlogSettings, 
     AssemblyName" /> 
    </configSections> 
    <BlogSettings frontPagePostCount="10" title="You’ve Been Haacked" /> 
</configuration> 

Esto es digno de una lectura:

http://haacked.com/archive/2007/03/12/custom-configuration-sections-in-3-easy-steps.aspx

3
foreach (string str in ConfigurationManager.AppSettings.AllKeys) 
    { 
     if (str.ToUpper().IndexOf("SOMESPECIAL") > -1) //the somespecial ones you want to add in 
      lstList.Add(ConfigurationManager.AppSettings[str]); 
    } 
+1

1 Bit hacky, pero me salvó algún tiempo jugando con secciones de configuración personalizada para una aplicación sencilla. –

+2

Esto solo funciona si las claves son únicas, es decir SOMESPECIAL-01, SOMESPECIAL-02, etc. Si simplemente repites SOMESPECIAL, solo puedes obtener la última. –

+0

@PaulGrimshaw Muy hacky de hecho y también tiene el [Problema turco İ] (http://haacked.com/archive/2012/07/05/turkish-i-problem-and-why-you-should-care.aspx/) Es mejor utilizar una sobrecarga con 'StringComparison' en su lugar y [' String.StartsWith'] (https://msdn.microsoft.com/en-us/library/ms131452 (v = vs.110) .aspx) mientras Está en eso. – Ronald

2

NinjaSettings hace esto de la caja.

En la consola de administrador de paquetes

Install-Package NinjaSettings 

Usted podría declarar su lista como

<appSettings> 
    <add key="List" value="50,20,10,100"/> 
    </appSettings> 

continuación, crear una interfaz con una asignación de lista a cualquier ICollection o matriz

public interface IAppSettings 
{ 
    List<int> List { get; } 
} 

luego acceda a su usuario de configuración el contenedor NinjaSettings. Generalmente le hilos Esta usando COI, pero el uso básico es

var settings = new NinjaSettings<IAppSettings>().Settings; 

    int total = 0; 
    for (var i in settings.List) 
    { 
     total+=i;   
    } 
Cuestiones relacionadas