在我们开发一些应用程序的时候,有时,会将一些应用程序配置信息保存在 **.cfg文件中,例如数据库连接配置等。
<Parameter>
<DBServer>./sqlexpress</DBServer>
<DBName>master</DBName>
<DBUsername>sa</DBUsername>
<DBPasseord>111111</DBPasseord>
</Parameter>
这样在运行应用程序时, 就可以直接从配置文件中读取数据库连接信息.
一般的做法是,根据需要配置的信息,一个一个写入xml文件或者一个一个从XML文件中读取。 这个本没有什么问题,但是如果我们应用程序需要配置的信息比较多,维护起来就不是很方便。
所以,我想是不是可以使用反射和范型来动态读写应用程序配置文件?
首先,我们创建一个参数实体类(一个属性对应一个配置节点)
/// <summary>
/// 参数定义实体类
/// </summary>
public class Parameter
{
#region Database Parameter
private string dbServer="";
public string DBServer
{
get { return dbServer; }
set { dbServer = value; }
}
private string dbName="";
public string DBName
{
get { return dbName; }
set { dbName = value; }
}
private string dbUsername="";
public string DBUsername
{
get { return dbUsername; }
set { dbUsername = value; }
}
private string dbPasseord="";
public string DBPasseord
{
get
{
return dbPasseord;
}
set
{
dbPasseord = value;
}
}
}
接着,我们要创建一个参数解析类,来动态读写XML配置文件
/// <summary>
/// 1 读取参数配置文件,得到parameter对象
/// 2 将parametere对象数据写入到XML文件
/// </summary>
public class ParameterAnalysis
{
/// <summary>
/// 将参数对象数据更新到XML文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t">对象</param>
/// <param name="filePath">XML文件路径</param>
public void UpdateXml<T>(T t,string filePath )
{
XmlDocument xmlDoc = LoadXmlDoc(filePath);
object obj = t;
object value;
XmlNode node = xmlDoc.SelectSingleNode("Parameter");
node.RemoveAll();
//解析对象的属性,一个属性为一个节点
PropertyInfo[] properties = obj.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
//创建节点
XmlNode childNode = xmlDoc.CreateNode(XmlNodeType.Element, property.Name, null);
value = property.GetValue(obj, null);
if (value != null)
{
childNode.InnerText = value.ToString();
}
else
{
childNode.InnerText = "";
}
node.AppendChild(childNode);
}
xmlDoc.Save(filePath);
}
/// <summary>
/// 从XML文件获取参数对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="filePath">XML文件路径</param>
/// <returns></returns>
public T GetObjectFromXml<T>(string filePath)
{
XmlDocument xmlDoc = LoadXmlDoc(filePath);
T o = Activator.CreateInstance<T>();
XmlNodeList nodes = xmlDoc.SelectSingleNode("Parameter").ChildNodes;
foreach (XmlNode node in nodes)
{
//属性存在
if (o.GetType().GetProperty(node.Name) != null)
{
//为对象的属性设置值
o.GetType().GetProperty(node.Name).SetValue(o, node.InnerText.Trim(), null);
}
}
return o;
}
/// <summary>
/// 加载XML文件
/// </summary>
/// <param name="filePath">XML文件路径</param>
/// <returns></returns>
private XmlDocument LoadXmlDoc(string filePath)
{
if (!File.Exists(filePath))
{
XmlTextWriter writer = new XmlTextWriter(filePath, UTF8Encoding.UTF8);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement("Parameter");
writer.WriteEndDocument();
writer.Close();
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
return xmlDoc;
}
}
在需要的地方可以使用如下代码来读取参数数据
Parameter parameter = new ParameterAnalysis().GetObjectFromXml<Parameter>(filepath);
使用如下的代码来更新参数(先实例化parameter对象)
new ParameterAnalysis().UpdateXml(parameter, filepath);
当应用程序的需求发生变化, 需要增加或删除配置信息的时候,只需要维护Parameter参数类就可以了(添加或删除属性),维护起来非常方便。
一点拙见, 希望能给新手一点参考。