访问当前应用程序的 appSettings 时,我得到一个 NameValueCollection:
NameValueCollection settings =
ConfigurationManager.AppSettings;
当访问另一个应用程序的 appSettings 时,我得到一个 KeyValueConfigurationCollection:
KeyValueConfigurationCollection settings =
ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings;
这两个方法(ConfigurationManager.AppSettings 和 AppSettingsSection.Settings)具有相似但不同(且不兼容)的返回类型是否有原因?也许我在这两种情况之一中使用了过时的方法?
有没有一种简单的方法可以在两种情况下获取相同的类型,即获取另一个应用程序的 appSettings 的 NameValueCollection 或当前运行的应用程序的 appSettings 的 KeyValueConfigurationCollection?
更新:对于问题 2,我发现以下方法可以将当前运行(非网络)应用程序的配置获取为 KeyValueConfigurationCollection:
KeyValueConfigurationCollection settings =
Configuration.ConfigurationManager.OpenExeConfiguration(Configuration.ConfigurationUserLevel.None).AppSettings.Settings;
最佳答案
两者都试图解决相同的问题,并且它们与相同的配置模式兼容,但正如您所说,不同之处在于它们在不同的开发时代发展。
但这并不是说您使用的是过时的版本。这些是获得相同结果的不同方法。也许您不明白为什么,但重点是有时您需要从不同的来源获取您的配置,因此选择这些选项是有意义的。
回答您的第二个问题,您可以为两种返回类型实现扩展方法,将它们转换为通用类型。 罢工>
例如,如果您想要 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 时代。但这并没有过时,因为这是(目前)的做法。
关于c# - .net 配置文件 AppSettings : NameValueCollection vs. KeyValueConfigurationCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4782384/