Come ottenere i valori di una ConfigurationSection di tipo NameValueSectionHandler

Sto lavorando con C #, Framework 3.5 (VS 2008).

Sto usando il ConfigurationManager per caricare una configurazione (non il file app.config predefinito) in un object Configuration.

Usando la class Configuration, sono stato in grado di ottenere un ConfigurationSection , ma non sono riuscito a trovare un modo per ottenere i valori di quella sezione.

Nella configurazione, ConfigurationSection è di tipo System.Configuration.NameValueSectionHandler .

Per quello che vale, quando ho usato il metodo GetSection del ConfigurationManager (funziona solo quando era nel mio file app.config predefinito), ho ricevuto un tipo di object, che potevo trasmettere in una raccolta di coppie di valori-chiave, e io appena ricevuto il valore come un dizionario. Non ho potuto fare questo cast quando ho ricevuto comunque la class ConfigurationSection dalla class Configuration.

EDIT: esempio del file di configurazione:

   

Esempio del modo in cui ero in grado di usarlo quando era su app.config (il metodo “GetSection” è solo per il file app.config predefinito):

 NameValueCollection myParamsCollection = (NameValueCollection)ConfigurationManager.GetSection("MyParams"); Console.WriteLine(myParamsCollection["FirstParam"]); Console.WriteLine(myParamsCollection["SecondParam"]); 

Ecco un buon post che mostra come farlo.

Se si desidera leggere i valori da un file diverso da app.config, è necessario caricarlo nel ConfigurationManager.

Prova questo metodo: ConfigurationManager.OpenMappedExeConfiguration ()

C’è un esempio di come usarlo nell’articolo MSDN.

Sofferto da un problema esatto. Il problema era dovuto a NameValueSectionHandler nel file .config. Dovresti utilizzare AppSettingsSection invece:

   

quindi nel codice C #:

 AppSettingsSection section = (AppSettingsSection)ConfigurationManager.GetSection("TEST"); 

btw NameValueSectionHandler non è più supportato in 2.0.

Prova ad utilizzare AppSettingsSection invece di NameValueCollection . Qualcosa come questo:

 var section = (AppSettingsSection)config.GetSection(sectionName); string results = section.Settings[key].Value; 

Fonte: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/d5079420-40cb-4255-9b3b-f9a41a1f7ad2/

L’unico modo in cui riesco a farlo funzionare è quello di istanziare manualmente il tipo di gestore di sezioni, passare il codice XML grezzo e lanciare l’object risultante.

Sembra abbastanza inefficiente, ma ci vai.

Ho scritto un metodo di estensione per incapsulare questo:

 public static class ConfigurationSectionExtensions { public static T GetAs(this ConfigurationSection section) { var sectionInformation = section.SectionInformation; var sectionHandlerType = Type.GetType(sectionInformation.Type); if (sectionHandlerType == null) { throw new InvalidOperationException(string.Format("Unable to find section handler type '{0}'.", sectionInformation.Type)); } IConfigurationSectionHandler sectionHandler; try { sectionHandler = (IConfigurationSectionHandler)Activator.CreateInstance(sectionHandlerType); } catch (InvalidCastException ex) { throw new InvalidOperationException(string.Format("Section handler type '{0}' does not implement IConfigurationSectionHandler.", sectionInformation.Type), ex); } var rawXml = sectionInformation.GetRawXml(); if (rawXml == null) { return default(T); } var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(rawXml); return (T)sectionHandler.Create(null, null, xmlDocument.DocumentElement); } } 

Il modo in cui lo chiameresti nel tuo esempio è:

 var map = new ExeConfigurationFileMap { ExeConfigFilename = @"c:\\foo.config" }; var configuration = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); var myParamsSection = configuration.GetSection("MyParams"); var myParamsCollection = myParamsSection.GetAs(); 

Questa è una vecchia domanda, ma io uso la seguente class per fare il lavoro. È basato sul blog di Scott Dorman :

 public class NameValueCollectionConfigurationSection : ConfigurationSection { private const string COLLECTION_PROP_NAME = ""; public IEnumerable> GetNameValueItems() { foreach ( string key in this.ConfigurationCollection.AllKeys ) { NameValueConfigurationElement confElement = this.ConfigurationCollection[key]; yield return new KeyValuePair (confElement.Name, confElement.Value); } } [ConfigurationProperty(COLLECTION_PROP_NAME, IsDefaultCollection = true)] protected NameValueConfigurationCollection ConfCollection { get { return (NameValueConfigurationCollection) base[COLLECTION_PROP_NAME]; } } 

L’utilizzo è semplice:

 Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); NameValueCollectionConfigurationSection config = (NameValueCollectionConfigurationSection) configuration.GetSection("MyParams"); NameValueCollection myParamsCollection = new NameValueCollection(); config.GetNameValueItems().ToList().ForEach(kvp => myParamsCollection.Add(kvp)); 

Ecco alcuni esempi di questo blog menzionati prima:

      

ottenere valori:

  NameValueCollection db = (NameValueCollection)ConfigurationSettings.GetConfig("Database"); labelConnection2.Text = db["ConnectionString"]; 

Un altro esempio:

  

ottieni valore:

 Hashtable loc = (Hashtable)ConfigurationSettings.GetConfig("Locations"); labelImport2.Text = loc["ImportDirectory"].ToString(); labelProcessed2.Text = loc["ProcessedDirectory"].ToString();