.net 配置文件 AppSettings:NameValueCollection 与 KeyValueConfigurationCollection

Posted

技术标签:

【中文标题】.net 配置文件 AppSettings:NameValueCollection 与 KeyValueConfigurationCollection【英文标题】:.net config file AppSettings: NameValueCollection vs. KeyValueConfigurationCollection 【发布时间】:2011-06-14 12:29:26 【问题描述】:

访问当前应用程序的 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;

【问题讨论】:

我知道这是一个老问题,但是 OP 中的建议答案(更新)在 web 应用程序中不起作用:~( @Pure.Krome:很好,谢谢。我已经更新了问题内的答案。不幸的是,我不知道 Web 应用程序的解决方案。 我稍后会添加一个 :) 我知道了.. 虽然旧,但仅供参考... Configuration.ConfigurationManager.OpenExeConfiguration(null) 的默认行为与 ConfigurationManager.AppSettings... 类型不兼容,但如果您反映OpenExeConfiguration 重载,你会看到 NULL 是默认行为的一个非常有效的选项。 【参考方案1】:

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

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

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

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

【讨论】:

感谢您的解释。关于转换问题:我想我已经找到了一个更简单的解决方案,请参阅我的问题的更新。 糟糕!这是真的,对不起这个错误!有了这个解决方案,扩展方法变得毫无用处,***再发明:) 优先依赖 System.Collections.Specialized.NameValueCollection 而不是 System.Configuration.KeyValueConfigurationCollection 可以使您的组件免于在配置部分中期望命名值。

以上是关于.net 配置文件 AppSettings:NameValueCollection 与 KeyValueConfigurationCollection的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core读取appsettings.json配置文件信息

.NET Core在类库中读取配置文件appsettings.json

ASP.NET Core appsettings.json 文件

干货:.net core实现读取appsettings.json配置文件(建议收藏)

干货:.net core实现读取appsettings.json配置文件(建议收藏)

vb.net 2.0 如何用Configuration.ConfigurationSettings.AppSettings读取配置文件中的内容?