我会使用一个单一的配置对象,如下所示:
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 + "'");
}
}
}
由于这是一个单例模式,因此它将在第一次从Setting
对象引用public static
属性时创建唯一的实例。
创建对象时,它会从Settings.ini
文件中读取内容。设置文件是一个纯文本文件,具有简单的key : value
结构,可能看起来像这样:
FrameMax : 12
VideoDir : C:\Videos\Best
该对象使用反射来发现每个属性并存储其初始值。在此示例中,已定义了两个属性:
public static int FrameMax { get; set; }
public static string VideoDir { get; set; }
代码目前处理的是
Int32
和
String
类型。通过在
switch
语句中添加额外的
case
语句,您可以轻松添加对
Float
和
Decimal
等类型的支持。
要更改设置,您可以使用以下代码:
Setting.FrameMax = 5
要检索设置,您可以使用以下方式:
if (Setting.FrameMax > 10) ...
你会注意到所有属性都是强类型的。此外,你不需要传递
Setting
对象,因为所有的
Setting
属性都是静态的,并且随时在任何地方可用。
我希望这个想法对你有所帮助。