我会使用如下的单个配置对象:
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,所以当第一次从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 属性都是static 并且始终可用。
我希望这个想法会有所帮助。