AppSettings 和 ConnectionStrings 都是 ConfigurationManager 上直接可用的属性。
但是,与您可以在 VS 设置设计器中编辑的熟悉的Settings.settings对应的 applicationSettings和userSettings并不那么容易获得。 AppSettings与applicationSettings不同,后者位于正在使用的配置文件的完全不同部分。
您必须使用上面的挖掘方法或变体来获取applicationSettings和userSettings。此外,applicationSettings只会在您下次启动应用程序时更新,如果您甚至能够在运行时完全写入它们。
例如(从别处抄袭-谢谢):
public static string ReadSetting(string sectionGroupName, string sectionName, string settingName, Configuration config = null)
{
if (config == null)
config = SharedConfigSettings;
// Get sectionGroup
var sectionGroup =
config.GetSectionGroup(sectionGroupName);
// Get section
var section =
(ClientSettingsSection)sectionGroup.Sections.Get(sectionName);
// Get setting
var setting = section.Settings.Get(settingName);
// Read setting value
return setting.Value.ValueXml.InnerText;
}
再举一个例子(来自许多例子——感谢世界):
///<summary>
/// return the applicationSettings section
///</summary>
///<returns></returns>
public static ClientSettingsSection GetSettingsSection(ConfigurationSectionGroup group, string clientSectionName)
{
return (ClientSettingsSection)group.Sections[clientSectionName];
}
///<summary>
/// return the section settings collection
///</summary>
///<returns></returns>
public static System.Configuration.SettingElementCollection GetSettingsCollection(ClientSettingsSection section)
{
return section.Settings;
}
///<summary>
/// return the connectionStrings section collection
///</summary>
///<returns></returns>
public static System.Configuration.SettingElementCollection ConnectionStringsCollection()
{
return ((ClientSettingsSection)SharedConfigSettings.GetSection("connectionStrings")).Settings;
}
///<summary>
/// A collection of all the UserSettings in a SettingElementCollection
///</summary>
///<returns></returns>
public static SettingElementCollection UserSettings()
{
return
GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"userSettings"),
@"MyAssembly.Properties.Settings"));
}
///<summary>
/// A collection of all the ApplicationSettings in a SettingElementCollection
///</summary>
///<returns></returns>
public static SettingElementCollection ApplicationSettings()
{
return
GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"),
@"MyAssembly.Properties.Settings"));
}
然后,不幸的是,您仍然必须处理这些部分的设置集合中的 SettingElement 对象。每个都必须反序列化为属性 Type ,除非它是一个字符串,例如 applicationSettings SettingElement (不能在运行时动态更新的):
(锻炼者)
var y = GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"), @"MyAssembly.Properties.Settings");
var c = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "WellKnownDirectories").Value).ValueXml
.InnerXml; // the setting as Xml
var xs = new XmlSerializer(typeof(string[]));
var strings = (string[])xs.Deserialize(new XmlTextReader(c, XmlNodeType.Element, null));
foreach (string s in strings)
{
Console.WriteLine(s);
}
对于字符串属性,它更容易(此示例与上面的第一个示例本质上是多余的):
var s = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "MyUserSettingName").Value).ValueXml
.InnerText
所有这些示例都使用了 applicationSettings。相同的方法可以与 userSettings 一起使用,可能会添加一些保存方法等,并且您确实需要跟踪(或多或少)多个配置文件中的哪些实际上正在播放 - 主文件、漫游文件或本地文件.
我为什么要这样做?因为两个相关的应用程序和一个公共类库(或多个库)都需要使用由其中一个应用程序拥有的相同设置,其中设置是可视化管理的。有没有人以更好的方式解决这个问题?
谢谢。