使用反射和范型来动态读写应用程序配置文件

在我们开发一些应用程序的时候,有时,会将一些应用程序配置信息保存在 **.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参数类就可以了(添加或删除属性),维护起来非常方便。

一点拙见, 希望能给新手一点参考。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值