C#反射實踐續

來源:互聯網
上載者:User
  前回在C#反射實踐的文章中,只介紹了利用反射如何把Xml檔案中的資料讀取設定到類對象的屬性中的方法,這回來介紹如何利用反射機制把值對象寫入Xml檔案的方法
  本文介紹的把值對象寫入Xml檔案的方法,有以下幾點約束
  1、值對象中的所有屬性必須是string類型的,不含儲存子節點資訊的屬性;
  2、自節點資料是儲存在範型List中的值對象。
  下面的saveToFile()方法是詳細的代碼實現,

首先需要在類檔案中引入以下.Net的命名空間:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Xml;
  5. using System.Reflection;
  6. using System.IO;

代碼實現:saveToFile()方法,

  1.         /// <summary>
  2.         ///  把指定的值對象的屬性值儲存到Xml檔案中相應的節點中,並儲存到檔案中
  3.         /// </summary>
  4.         /// <param name="obj">需要儲存的值對象</param>
  5.         /// <param name="parentNode">儲存值對象資料的父節點</param>`
  6.         /// <param name="nodeIndex">子節點的索引</param>
  7.         /// <history>
  8.         private void saveToFile(object obj, XmlNode parentNode, int nodeIndex)
  9.         {
  10.             //取得類名稱,作為xml檔案的節點名。
  11.             string nodeName = obj.GetType().Name;
  12.             //取得指定對象的屬性
  13.             PropertyInfo[] proLst = obj.GetType().GetProperties();
  14.             //準備儲存值對象屬性值得xml的節點對象。
  15.             XmlNode node = null;
  16.             //取得節點的個數
  17.             int nodeCount = xmlDoc.GetElementsByTagName(nodeName).Count;
  18.             //節點存時,取得已經存在的節點
  19.             if (nodeIndex < nodeCount)
  20.             {
  21.                 node = xmlDoc.GetElementsByTagName(nodeName).Item(nodeIndex);
  22.             }
  23.             //節點不存在時,建立一個新的節點,並把這個節點追加到xml的文檔對象中
  24.             if (node == null)
  25.             {
  26.                 node = xmlDoc.CreateElement(nodeName);
  27.                 if (parentNode == null)
  28.                 {
  29.                     this.rootNode.AppendChild(node);
  30.                 }
  31.                 else
  32.                 {
  33.                     parentNode.AppendChild(node);
  34.                 }
  35.             }
  36.             //把對象的屬性值儲存到Xml文檔對象的對應的節點屬性中
  37.             foreach (PropertyInfo pro in proLst)
  38.             {
  39.                 XmlElement xmlE = (XmlElement)node;
  40.                 //屬性是值對象的場合,只認string資料類型哦
  41.                 if (pro.PropertyType.Name.IndexOf("String") >= 0)
  42.                 {
  43.                     //設定xml節點的屬性值
  44.                     xmlE.SetAttribute(pro.Name, pro.GetValue(obj, null).ToString());
  45.                 }
  46.                 //屬性是範型的場合,此預設資料類型是範型List<>
  47.                 else if (pro.PropertyType.IsGenericType == true)
  48.                 {
  49.                     //利用反射取得屬性的get方法。
  50.                     MethodInfo m = pro.GetGetMethod();
  51.                     //利用反射調用屬性的get方法,取得屬性的值
  52.                     object rs = m.Invoke(obj, null);
  53.                     //取得List中的對象數
  54.                     int count = (int)rs.GetType().GetProperty("Count").GetValue(rs, null);
  55.                     for (int i = 0; i < count; i++)
  56.                     {
  57.                         //取得List中指定索引的對象
  58.                         object param = rs.GetType().GetProperty("Item").GetValue(rs, new object[] { i });
  59.                         //第歸調用實現子節點的向Xml的文檔對象的儲存
  60.                         saveToFile(param, node, i);
  61.                     }
  62.                 }
  63.                 //Xml節點對象的場合
  64.                 else
  65.                 {
  66.                     //利用反射取得屬性的get方法。
  67.                     MethodInfo m = pro.GetGetMethod();
  68.                     //利用反射調用屬性的get方法,取得屬性的值
  69.                     object rs = m.Invoke(obj, null);
  70.                     saveToFile(rs, node, 0);
  71.                 }
  72.             }
  73.             //把xml的文檔對象儲存到指定的xml檔案中
  74.             xmlDoc.Save(this.filePath);
  75.         }

注意:在上面的代碼要想正常編譯,需要聲明一下類的欄位變數

  1.         //xml檔案的路徑
  2.         private string filePath;
  3.         //儲存xml檔案資訊的文檔對象
  4.         private XmlDocument xmlDoc = null;
  5.         //xml檔案的根節點名
  6.         private string rootNodeName = "ReflectionTest";
  7.         //xml檔案的根節點對象
  8.         private XmlNode rootNode;

類的構造器請參照下記代碼:

  1.        //構造器
  2.         public TestConfig(string configFilePath)
  3.         {
  4.             xmlDoc = new XmlDocument();
  5.             createXmlRootNode(filePath);
  6.             filePath = configFilePath;
  7.         }

上面的createXmlRootNode方法,是用來初始化Xml的文檔對象-XmlDocument的,實現方式如下:

  1.         /// <summary>
  2.         ///  初始化XMLDocument對象
  3.         /// </summary>
  4.         /// <param name="fileName">Xml的檔案名稱</param>
  5.         private void createXmlRootNode(string fileName)
  6.         {
  7.             if (File.Exists(fileName) == true)
  8.             {
  9.                 xmlDoc.Load(fileName);
  10.                 rootNode = xmlDoc.GetElementsByTagName(rootNodeName).Item(0);
  11.             }
  12.             else
  13.             {
  14.                 xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null));
  15.                 rootNode = xmlDoc.CreateElement(rootNodeName);
  16.                 xmlDoc.AppendChild(rootNode);
  17.             }
  18.         }

saveToFile()方法的調用方法如下:

  1.         /// <summary>
  2.         ///  把指定的值對象的屬性值儲存到Xml檔案中
  3.         /// </summary>
  4.         public void saveToXml()
  5.         {      
  6.             saveToFile(this, null, 0);
  7.         }

上面代碼中的this可以是任意的一個按照本文約束規則編寫的值對象,null表示要把這值對象作為Xml檔案的根節點進行設定,0這個參數是針對一個值對象中包含有範型List<>類型的字對象的情況,如果沒有這種類型,直接設定成0就可以了,如果有請參照saveToFile()方法中第歸調用時的設定方法,它的值就是List中對象的索引值。
 
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.