Файл конфигурации .net AppSettings: NameValueCollection vs. KeyValueConfigurationCollection - PullRequest
12 голосов
/ 24 января 2011

При доступе к appSettings текущего приложения я получаю NameValueCollection:

NameValueCollection settings =
    ConfigurationManager.AppSettings;

При доступе к настройкам приложения другого приложения я получаю KeyValueConfigurationCollection:

KeyValueConfigurationCollection settings = 
    ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings;

  1. Есть ли причина, по которой эти два метода ( ConfigurationManager.AppSettings и AppSettingsSection.Settings ) имеют похожие, но разные (и несовместимые) типы возвращаемых данных? Может быть, я использую устаревший метод в одном из двух случаев?

  2. Существует ли простой способ получить один и тот же тип в обоих случаях, т. Е. Получить коллекцию NameValueCollection для appSettings другого приложения или KeyValueConfigurationCollection для appSettings приложения текущего запущенного приложения?


Обновление : Для вопроса 2 я нашел следующий способ получить конфигурацию запущенного в настоящее время (не веб-приложения) приложения в виде KeyValueConfigurationCollection:

KeyValueConfigurationCollection settings = 
    Configuration.ConfigurationManager.OpenExeConfiguration(Configuration.ConfigurationUserLevel.None).AppSettings.Settings;

1 Ответ

2 голосов
/ 24 января 2011

Оба пытаются решить одну и ту же проблему, и они совместимы с одной и той же схемой конфигурации, но разница заключается в том, что оба они развивались в разное время разработки, как вы сказали.

Но этоне о том, что вы используете устаревшие версии.Это разные способы получить один и тот же результат.Может быть, вы не можете понять, почему, но дело в том, что иногда вам нужно получить свою конфигурацию из разных источников, поэтому имеет смысл иметь эти опции.

Отвечая на второй вопрос, вы можете реализовать метод расширениядля обоих возвращаемых типов преобразование их в общий тип.

Например, если вы хотите NameValueCollection, вы можете реализовать это:

public static NameValueCollection ToCollection(this KeyValueConfigurationCollection source)
{
       // An iterator to create a NameValueCollection here and return it.
}

Или, если вы хотите KeyValueConfigurationCollection, вы можете сделать то же самое, но для возврата экземпляров этого типа.

Затем, когда вам нужны AppSettings, вы можете сделать ConfigurationManager.AppSettings.ToCollection(); и / или ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings.ToCollection();. Проверить редактирование ответа автора!Эта часть моего ответа неверна и бесполезна :) Спасибо.

На самом деле коллекции имен и значений в какой-то степени устарели, поскольку они были получены в .net 1.x дней.Но это не устарело, потому что это способ сделать это (пока).

...