每次我尝试使用内置的 app.config 文件时,由于内置解决方案的缺点,我最终实现了自己的配置解决方案。实现自定义的基于 xml 的解决方案并不复杂。这实际上很容易。
只需将此基类放入您的解决方案中:
[Serializable]
public abstract class ConfigBase<DerivedT> where DerivedT : ConfigBase<DerivedT>
{
protected string FilePath;
public string FileVersion;
public ConfigBase() { }
public void Save()
{
XmlSerializer xs = new XmlSerializer(GetType());
using (StreamWriter writer = File.CreateText(FilePath))
{
xs.Serialize(writer, this);
}
}
public static DerivedT Load(string filename)
{
XmlSerializer xs = new XmlSerializer(typeof(DerivedT));
using (StreamReader reader = File.OpenText(filename))
{
DerivedT config = (DerivedT)xs.Deserialize(reader);
config.FilePath = filename;
return config;
}
}
}
然后你可以像这样制作你的配置文件:
public class Config : ConfigBase<Config>
{
// put your variables here like below
public string DatabaseConnectionString;
public int numberOfConnections;
}
像这样使用它:
// Load it like this
Config config = Config.Load(ConfigFileName);
// Save it like this
config.Save();
随意在配置文件中使用属性、数组和其他复杂结构。它将全部自动序列化。如果您不想序列化某些字段/属性,请使用 XmlIgnore 属性。使用此解决方案,您可以拥有许多不同的配置文件,但只有一个机制来加载和保存它们。
我经常在 Config 文件中包含一个公共静态 Config GenerateDefault(string ConfigFileName) 工厂方法,它将生成一个具有默认值的示例配置。
不要忘记检查文件文件是否存在并将其加载到 try/catch 块中。
一个更好的解决方案是使用 DataContracts,它允许您序列化私有成员并提供良好的机制来支持不同版本的 DataContracts,但它有点复杂。