.NET 4.x Создать файл конфигурации - C#
Формулировка задачи:
Доброго времени суток, возникла необходимость создать файл конфигурации для приложения, и так как оно написано на WPF и полностью придерживается паттерна MVVM, нужно всего запомнить пару десятков значений переменных, залепить их в файл и при следующем запуске считать, как это сделать красиво и без геморроя? Я могу и так написать это, но будет громоздко. Может кто знает как изменить значение переменной по ключу из словаря с таким же значением ключа, как имя переменной? Вроде : Переменная GetItems Типа bool, а в словаре key: GetItems, value = true , и присвоить значение тру в ту переменную Ну надеюсь вы поймёте, очень спешу, дело очень срочно, если можно набросать код, буду крайне признателен
Решение задачи: «.NET 4.x Создать файл конфигурации»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Reflection;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using Universal.UI.Forms;
namespace Universal.UI {
[Serializable]
public class Settings {
#region FIELDS
/// <summary>
/// Путь к файлу с данными сериализации
/// </summary>
[NonSerialized]
private static string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "settings.bin");
/// <summary>
/// Статическое поле экземпляра
/// </summary>
[NonSerialized]
private static Settings instance = null;
/// <summary>
/// Тип выбранного интерфейса взаимодействия
/// </summary>
private string interfaceType;
/// <summary>
/// Имя последовательного порта
/// </summary>
private string portName;
/// <summary>
/// Тип выбранной платформы
/// </summary>
private string platformType;
/// <summary>
/// Уровень питания Usbdm
/// </summary>
private string vddValue;
/// <summary>
/// Язык интерфейса
/// </summary>
private string language;
#endregion
#region PROPERTIES
/// <summary>
/// Свойство выбранного интерфейса взаимодействия
/// </summary>
public string InterfaceType {
get { return interfaceType; }
set { interfaceType = value; }
}
/// <summary>
/// Свойство имени последовательного порта
/// </summary>
public string PortName {
get { return portName; }
set { portName = value; }
}
/// <summary>
/// Свойство типа платформы
/// </summary>
public string PlatformType {
get { return platformType; }
set { platformType = value; }
}
/// <summary>
/// Свойство уровня питания Usbdm
/// </summary>
public string VddValue {
get { return vddValue; }
set { vddValue = value; }
}
/// <summary>
/// Свойство языка интерфейса
/// </summary>
public string Language {
get { return language; }
set { language = value; }
}
/// <summary>
/// Статическое свойство экземпляра
/// </summary>
public static Settings Instance {
get {
if (instance == null) {
instance = new Settings();
}
return instance;
}
}
#endregion
/// <summary>
/// Закрытый конструктор
/// </summary>
private Settings() {
InterfaceType = "HWKey";
PortName = "";
PlatformType = "ARCADIA";
Language = "RU";
VddValue = "OFF";
}
/// <summary>
/// Сохранение настроек в файл
/// </summary>
public static void Save(){
try {
using (Stream stream = File.OpenWrite(path)) {
BinaryFormatter serializer = new BinaryFormatter();
serializer.SurrogateSelector = Settings.SurrogateSelector;
serializer.Serialize(stream, Settings.Instance);
}
}
catch { return; }
}
/// <summary>
/// Загрузка настроек из файла
/// </summary>
public static void Load() {
try {
using (Stream stream = File.OpenRead(path)) {
BinaryFormatter serializer = new BinaryFormatter();
serializer.SurrogateSelector = Settings.SurrogateSelector;
serializer.Deserialize(stream);
}
}
catch { return; }
}
/// <summary>
/// Суррогатный селектор сериализации
/// </summary>
public static SurrogateSelector SurrogateSelector {
get {
var selector = new SurrogateSelector();
var singleton = typeof(Settings);
var context = new StreamingContext(StreamingContextStates.All);
var surrogate = new SerializationSurrogate();
selector.AddSurrogate(singleton, context, surrogate);
return selector;
}
}
/// <summary>
/// Реализация селектора суррогата сериализации
/// </summary>
private sealed class SerializationSurrogate : ISerializationSurrogate {
void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context) {
Settings singleton = Settings.Instance;
var fields = typeof(Settings).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (var field in fields) {
info.AddValue(field.Name, field.GetValue(singleton));
}
}
object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) {
Settings singleton = Settings.Instance;
foreach (var i in info) {
singleton.GetType().GetField(i.Name, BindingFlags.Instance|BindingFlags.NonPublic)
.SetValue(singleton, i.Value);
}
return singleton;
}
}
}
}