访问当前应用程序的appSettings时,我得到一个NameValueCollection:
NameValueCollection settings =
ConfigurationManager.AppSettings;
访问其他应用程序的appSettings时,我得到一个KeyValueConfigurationCollection:
KeyValueConfigurationCollection settings =
ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings;
为什么这两种方法(ConfigurationManager.AppSettings和AppSettingsSection.Settings)具有相似但不同(且不兼容)的返回类型?也许我在两种情况之一中使用了过时的方法?
在这两种情况下是否有一种简单的方法可以获得相同的类型,即获取另一个应用程序的appSettings的NameValueCollection或当前正在运行的应用程序的appSettings的KeyValueConfigurationCollection?
更新:对于问题2,我找到了以下方法来将当前正在运行的(非Web)应用程序的配置作为KeyValueConfigurationCollection:
KeyValueConfigurationCollection settings =
Configuration.ConfigurationManager.OpenExeConfiguration(Configuration.ConfigurationUserLevel.None).AppSettings.Settings;
答案 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天。但它并没有过时,因为这是这样做的方式(目前)。