.net配置文件AppSettings:NameValueCollection与KeyValueConfigurationCollection

Hei*_*nzi 13 .net c# vb.net configuration app-config

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

NameValueCollection settings =
    ConfigurationManager.AppSettings;
Run Code Online (Sandbox Code Playgroud)

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

KeyValueConfigurationCollection settings = 
    ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings;
Run Code Online (Sandbox Code Playgroud)
  1. 这两个方法(ConfigurationManager.AppSettingsAppSettingsSection.Settings)具有相似但不同(和不兼容)的返回类型是否有原因?也许我在两种情况之一中使用过时的方法?

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


更新:对于问题2,我发现以下方法将当前运行的(非Web)应用程序配置为KeyValueConfigurationCollection:

KeyValueConfigurationCollection settings = 
    Configuration.ConfigurationManager.OpenExeConfiguration(Configuration.ConfigurationUserLevel.None).AppSettings.Settings;
Run Code Online (Sandbox Code Playgroud)

Mat*_*zer 3

两者都试图解决相同的问题,并且它们与相同的配置模式兼容,但区别在于,正如您所说,两者都是在不同的开发时代演变的。

但这与您使用过时的版本无关。这些是获得相同结果的不同方法。也许您不明白为什么,但关键是有时您需要从不同的来源获取配置,因此拥有这些选项是有意义的。

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

例如,如果您想要 NameValueCollection,您可以实现:

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

或者,如果您想要 KeyValueConfigurationCollection,您可以执行相同的操作,但要返回此类型的实例。

然后,当您需要 AppSettings 时,您可以执行ConfigurationManager.AppSettings.ToCollection();和/或 ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings.ToCollection(); 检查作者的答案编辑!我的这部分答案是错误且无用的:)谢谢。

事实上,名称-值集合在某种程度上已经过时了,因为它是从 .net 1.x 时代开始的。但它并没有过时,因为这是(目前)这样做的方式。