.net файл конфигурации AppSettings: NameValueCollection и KeyValueConfigurationCollection

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

NameValueCollection settings =
    ConfigurationManager.AppSettings;

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

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

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

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


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

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

Ответ 1

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

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

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

Например, если вы хотите 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 дней. Но это не устарело, потому что это способ сделать это (на данный момент).