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, которые находятся в коллекции настроек в этих разделах. Каждый из них должен быть десериализован в свойство Type, если это не строка, например для ApplicationSettings SettingElement (который не может быть динамически обновлен во время выполнения):
(*) использование нагрузочных 1033 *
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
Все эти примеры возились с настройками приложения. Тот же самый подход может работать с пользовательскими настройками с добавлением, вероятно, некоторых методов сохранения и т. Д., И вам необходимо отслеживать (более или менее), какой из нескольких конфигурационных файлов в действительности находится в игре - основной, перемещаемый или локальный .
Почему я это делаю? Поскольку два связанных приложения и общая библиотека классов (или библиотеки) должны использовать одни и те же настройки, принадлежащие одному из приложений, в которых эти параметры управляются визуально. Кто-нибудь решил это лучше?
Спасибо.