Как получить значения ConfigurationSection типа NameValueSectionHandler - PullRequest
62 голосов
/ 11 августа 2010

Я работаю с C #, Framework 3.5 (VS 2008).

Я использую ConfigurationManager для загрузки конфигурации (а не файла app.config по умолчанию) в объект конфигурации.

Используя класс конфигурации, я смог получить ConfigurationSection, но не смог найти способ получить значения этого раздела.

В конфигурации ConfigurationSectionтипа System.Configuration.NameValueSectionHandler.

Для чего это стоит, когда я использовал метод GetSection из ConfigurationManager (работает только, когда он был в моем файле app.config по умолчанию), я получил тип объекта, что я мог бы привести в коллекцию пар ключ-значение, и я только что получил значение, как словарь.Однако я не мог выполнить такое приведение, когда получил класс ConfigurationSection из класса Configuration.

EDIT: Пример файла конфигурации:

<configuration>
  <configSections>
    <section name="MyParams" 
             type="System.Configuration.NameValueSectionHandler" />
  </configSections>

  <MyParams>
    <add key="FirstParam" value="One"/>
    <add key="SecondParam" value="Two"/>
  </MyParams>
</configuration>

Пример способа, которым я смогиспользуйте его, когда он был в app.config (метод «GetSection» предназначен только для app.config по умолчанию):

NameValueCollection myParamsCollection =
             (NameValueCollection)ConfigurationManager.GetSection("MyParams");

Console.WriteLine(myParamsCollection["FirstParam"]);
Console.WriteLine(myParamsCollection["SecondParam"]);

Ответы [ 6 ]

20 голосов
/ 04 марта 2013

Пострадал от точного вопроса. Проблема была из-за NameValueSectionHandler в файле .config. Вместо этого вы должны использовать AppSettingsSection:

<configuration>

 <configSections>
    <section  name="DEV" type="System.Configuration.AppSettingsSection" />
    <section  name="TEST" type="System.Configuration.AppSettingsSection" />
 </configSections>

 <TEST>
    <add key="key" value="value1" />
 </TEST>

 <DEV>
    <add key="key" value="value2" />
 </DEV>

</configuration>

затем в коде C #:

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

Кстати, NameValueSectionHandler больше не поддерживается в 2.0.

17 голосов
/ 11 августа 2010

Вот хороший пост, который показывает, как это сделать.

Если вы хотите прочитать значения из файла, отличного от app.config, вам необходимо загрузить его в ConfigurationManager.

Попробуйте этот метод: ConfigurationManager.OpenMappedExeConfiguration ()

Пример использования этого метода в статье MSDN.

13 голосов
/ 17 января 2013

Попробуйте использовать AppSettingsSection вместо NameValueCollection. Примерно так:

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

Источник: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/d5079420-40cb-4255-9b3b-f9a41a1f7ad2/

8 голосов
/ 20 марта 2014

Единственный способ заставить это работать - вручную создать экземпляр типа обработчика раздела, передать ему необработанный XML и привести полученный объект.

Кажется, довольно неэффективно, но вы идете.

Я написал метод расширения для инкапсуляции этого:

public static class ConfigurationSectionExtensions
{
    public static T GetAs<T>(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);
    }
}

В вашем примере вы бы назвали это:

var map = new ExeConfigurationFileMap
{
    ExeConfigFilename = @"c:\\foo.config"
};
var configuration = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
var myParamsSection = configuration.GetSection("MyParams");
var myParamsCollection = myParamsSection.GetAs<NameValueCollection>();
3 голосов
/ 03 октября 2013

Это старый вопрос, но я использую следующий класс, чтобы сделать работу.Он основан на блоге Скотта Дормана :

public class NameValueCollectionConfigurationSection : ConfigurationSection
{
    private const string COLLECTION_PROP_NAME = "";

    public IEnumerable<KeyValuePair<string, string>> GetNameValueItems()
    {
        foreach ( string key in this.ConfigurationCollection.AllKeys )
        {
            NameValueConfigurationElement confElement = this.ConfigurationCollection[key];
            yield return new KeyValuePair<string, string>
                (confElement.Name, confElement.Value);
        }
    }

    [ConfigurationProperty(COLLECTION_PROP_NAME, IsDefaultCollection = true)]
    protected NameValueConfigurationCollection ConfCollection
    {
        get
        {
            return (NameValueConfigurationCollection) base[COLLECTION_PROP_NAME];
        }
    }

Использование простое:

Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
NameValueCollectionConfigurationSection config = 
    (NameValueCollectionConfigurationSection) configuration.GetSection("MyParams");

NameValueCollection myParamsCollection = new NameValueCollection();
config.GetNameValueItems().ToList().ForEach(kvp => myParamsCollection.Add(kvp));
2 голосов
/ 28 сентября 2016

Вот несколько примеров из этого блога , упомянутых ранее:

<configuration>    
   <Database>    
      <add key="ConnectionString" value="data source=.;initial catalog=NorthWind;integrated security=SSPI"/>    
   </Database>    
</configuration>  

получить значения:

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

-

Другой пример:

<Locations 
   ImportDirectory="C:\Import\Inbox"
   ProcessedDirectory ="C:\Import\Processed"
   RejectedDirectory ="C:\Import\Rejected"
/>

получить значение:

Hashtable loc = (Hashtable)ConfigurationSettings.GetConfig("Locations"); 

labelImport2.Text = loc["ImportDirectory"].ToString();
labelProcessed2.Text = loc["ProcessedDirectory"].ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...