Я бы использовал один объект конфигурации, подобный следующему:
using System;
using System.IO;
using System.Reflection;
public sealed class Setting {
public static int FrameMax { get; set; }
public static string VideoDir { get; set; }
static readonly string SETTINGS = "Settings.ini";
static readonly Setting instance = new Setting();
Setting() {}
static Setting() {
string property = "";
string[] settings = File.ReadAllLines(SETTINGS);
foreach (string s in settings)
try {
string[] split = s.Split(new char[] { ':' }, 2);
if (split.Length != 2)
continue;
property = split[0].Trim();
string value = split[1].Trim();
PropertyInfo propInfo = instance.GetType().GetProperty(property);
switch (propInfo.PropertyType.Name) {
case "Int32":
propInfo.SetValue(null, Convert.ToInt32(value), null);
break;
case "String":
propInfo.SetValue(null, value, null);
break;
}
} catch {
throw new Exception("Invalid setting '" + property + "'");
}
}
}
Поскольку это singleton , при первом обращении к свойству public static
из объекта Setting
будет создан один и только один его экземпляр.
Когда объект создан, он читает из файла Settings.ini
. Файл настроек представляет собой простой текстовый файл с простой структурой key : value
, которая может выглядеть следующим образом:
FrameMax : 12
VideoDir : C:\Videos\Best
Объект использует отражение, чтобы обнаружить каждое свойство и сохранить его начальное значение. В этом примере были определены два свойства:
public static int FrameMax { get; set; }
public static string VideoDir { get; set; }
Код, как написано, обрабатывает типы Int32
и String
. Добавив дополнительные операторы case
в оператор switch
, вы можете легко добавить поддержку таких типов, как Float
и Decimal
.
.
Чтобы изменить настройку, вы должны использовать что-то вроде:
Setting.FrameMax = 5;
Чтобы получить настройку, вы должны использовать что-то вроде:
if (Setting.FrameMax > 10) ...
Вы заметите, что все свойства строго типизированы. Кроме того, вам не нужно передавать объект Setting
, поскольку все свойства Setting
static
и всегда доступны везде.
Надеюсь, эта идея полезна.