Если вам не нужно использовать конструктор настроек или редактировать настройки с помощью текстового редактора, вы можете создать простой класс, производный от ApplicationSettingsBase :
namespace MyNamespace
{
using System.Collections.Generic;
using System.Configuration;
/// <summary>
/// Persistent store for my parameters.
/// </summary>
public class MySettings : ApplicationSettingsBase
{
/// <summary>
/// The instance lock.
/// </summary>
private static readonly object InstanceLock = new object();
/// <summary>
/// The instance.
/// </summary>
private static MySettings instance;
/// <summary>
/// Prevents a default instance of the <see cref="MySettings"/> class
/// from being created.
/// </summary>
private MySettings()
{
// don't need to do anything
}
/// <summary>
/// Gets the singleton.
/// </summary>
public static MySettings Instance
{
get
{
lock (InstanceLock)
{
if (instance == null)
{
instance = new MySettings();
}
}
return instance;
}
}
/// <summary>
/// Gets or sets the parameters.
/// </summary>
[UserScopedSetting]
[SettingsSerializeAs(SettingsSerializeAs.Binary)]
public Dictionary<string, string> Parameters
{
get
{
return (Dictionary<string, string>)this["Parameters"];
}
set
{
this["Parameters"] = value;
}
}
}
}
Реальный трюк - это атрибут [SettingsSerializeAs (SettingsSerializeAs.Binary)] . Большинство (все?) Классов могут быть сериализованы таким образом, когда SettingsSerializeAs.String или SettingsSerializeAs.Xml не будет работать для словаря.
Используйте это в своем коде как обычные настройки:
// this code untested...
MySettings.Instance.Parameters["foo"] = "bar";
MySettings.Instance.Parameters.Save();
MySettings.Instance.Parameters.Reload();
string bar;
if (!MySettings.Instance.Parameters.TryGetValue("foo", out bar))
{
throw new Exception("Foobar");
}
Если вы хотите, чтобы словарь сериализовался в нечто, редактируемое пользователем, вы должны извлечь его из словаря и поиграть с TypeConverter (см. Использование пользовательских классов с настройками приложения ).