AppSettings и ConnectionStrings являются свойствами, доступными непосредственно в ConfigurationManager.
Однако applicationSettings и userSettings, которые соответствуют знакомым Settings.settings, которые вы можете редактировать в дизайнере настроек VS, не так просто получить. в. 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, которые находятся в коллекции настроек в этих разделах. Каждый из них должен быть десериализован в тип свойства, если только он не является строкой, например. для элемента настройки applicationSettings (который не может быть динамически обновлен во время выполнения):
(тренажер)
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 с добавлением, возможно, некоторых методов сохранения и т. Д., И вам нужно отслеживать (более или менее), какой из нескольких файлов конфигурации фактически используется - основной, перемещаемый или локальный. .
Почему я это делаю? Потому что два связанных приложения и общая библиотека классов (или библиотеки) должны использовать одни и те же параметры, принадлежащие одному из приложений, где параметры управляются визуально. Кто-нибудь решил это лучше?
Спасибо.
person
AllenM
schedule
21.07.2011