.NET配置文件AppSettings: NameValueCollection与KeyValueConfigurationCollection的区别

15

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

NameValueCollection settings =
    ConfigurationManager.AppSettings;

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

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

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

  2. 是否有一种简单的方法来获取相同类型的结果,即获取另一个应用程序的appSettings的NameValueCollection或当前运行应用程序的appSettings的KeyValueConfigurationCollection?


更新: 对于问题2,我已找到以下方法以将非web应用程序的配置作为KeyValueConfigurationCollection获取:

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

我知道这是一个老问题,但是OP中建议的答案(更新)在_Web_应用程序中不起作用:~( - Pure.Krome
@Pure.Krome:好观点,谢谢。我已经更新了我的问题答案。不幸的是,我不知道Web应用程序的解决方案。 - Heinzi
我会稍后添加的 :) 我已经处理好了。 - Pure.Krome
虽然有些老旧,但是一个快速的FYI... Configuration.ConfigurationManager.OpenExeConfiguration(null) 和 ConfigurationManager.AppSettings 做了相同的默认行为...类型不兼容,但如果你反射 OpenExeConfiguration 的重载方法,你会发现 NULL 是一个非常有效的默认行为选项。 - Scott Brickey
1个回答

3
两者都试图解决相同的问题,并且与相同的配置模式兼容,但区别在于它们在不同的开发时间内发展。但这并不是因为您正在使用过时版本。那些是获得相同结果的不同方法。也许您无法理解原因,但有时需要从不同的来源获取配置,因此具有这些选项是有意义的。
例如,如果您想要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时代。但是它并不过时,因为这是目前的做法。

谢谢您的解释。关于转换问题:我认为我已经找到了一个更简单的解决方案,请参见我问题的更新。 - Heinzi
糟糕!没错,对于这个错误我很抱歉!有了那个解决方案,扩展方法就变得无用了,简直是重复造轮子 :) - Matías Fidemraizer
更倾向于使用System.Collections.Specialized.NameValueCollection而不是System.Configuration.KeyValueConfigurationCollection的依赖,可以使您的组件不必期望在配置部分中命名值。 - Sean M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接