.net配置文件AppSettings:NameValueCollection与KeyValueConfigurationCollection

时间:2011-01-24 13:14:10

标签: c# .net vb.net configuration app-config

访问当前应用程序的appSettings时,我得到一个NameValueCollection:

NameValueCollection settings =
    ConfigurationManager.AppSettings;

访问其他应用程序的appSettings时,我得到一个KeyValueConfigurationCollection:

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

  1. 为什么这两种方法(ConfigurationManager.AppSettingsAppSettingsSection.Settings)具有相似但不同(且不兼容)的返回类型?也许我在两种情况之一中使用了过时的方法?

  2. 在这两种情况下是否有一种简单的方法可以获得相同的类型,即获取另一个应用程序的appSettings的NameValueCollection或当前正在运行的应用程序的appSettings的KeyValueConfigurationCollection?


  3. 更新:对于问题2,我找到了以下方法来将当前正在运行的(非Web)应用程序的配置作为KeyValueConfigurationCollection:

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

1 个答案:

答案 0 :(得分:2)

两者都试图解决同样的问题并且它们与相同的配置模式兼容,但不同之处在于两者都在不同的开发时间内发展,正如您所说。

但这不是关于你使用过时的版本。这些是获得相同结果的不同方式。也许你无法理解为什么,但有时你需要从不同的来源获得你的配置,所以有这些选择是有意义的。

回答第二个问题,您可以为两种返回类型实现扩展方法,将它们转换为通用类型。

<击>

例如,如果你想要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天。但它并没有过时,因为这是这样做的方式(目前)。