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

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

NameValueCollection settings =
    ConfigurationManager.AppSettings;

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

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

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

  2. есть ли простой способ получить один и тот же тип в обоих случаях, т. е. получить 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();. Регистрация авторский ответ edit! Эта часть моего ответа неверна и бесполезна:) спасибо.

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