2011-01-24 58 views
10

当访问应用程序的当前的appSettings,我得到的NameValueCollection:.NET配置文件的AppSettings:NameValueCollection中主场迎战KeyValueConfigurationCollection

NameValueCollection settings = 
    ConfigurationManager.AppSettings; 

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

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

  1. 请问这两种方法的原因是什么(ConfigurationManager.AppSettingsAppSettingsSection.Settings)具有相似但不同(和不兼容)的返回类型?也许我在两种情况之一中使用了过时的方法?

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


更新:对于问题2,我发现下面的方式来获得的配置当前运行(非Web)应用程序作为KeyValueConfigurationCollection:

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

我知道这是一个老问题,但OP中的建议答案(更新)不适用于_web_应用程序:〜( – 2015-04-22 09:18:42

+0

@ Pure.Krome:好点,谢谢。我更新了我的答案-Iside-the-question。不幸的是,我不知道一个解决方案的web应用程序。 – Heinzi 2015-04-22 10:07:52

回答

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天。但它并没有过时,因为这是现在这样做的方式。

相关问题