MVC 閒暇實作 [將 List<T> 儲存為DataSet 的XML]

會分享這一篇是因為筆者常常在測試一些 MVC 的程式,有時筆者只是很快的畫一個 Class Diagram ,很直覺的直接套用到 View 上頭,直接套 CRUD 看結果,如果我可以直接存入如 List 的資料到XML 之中,那不是挺方便的...

會分享這一篇是因為筆者常常在測試一些 MVC 的程式,因為筆者真的很懶XD,有時筆者只是很快的畫一個 Class Diagram 。如下:

image

很直覺的直接套用到 View 上頭,直接套 CRUD 看結果,顯然的是直接處理 List<T> 類型的物件,但因為有時只是個小測試,只是想測試畫面的效果而已。可是不開 EDM 或 將資料存入 DB 又很難做出 CRUD 的效果,有時要給客戶看東西或是 DMEO 都挺麻煩的。

image

為了使畫面我可以直接存入如 List<Product> 的資料到XML 之中,那不是挺方便的!於是利用一個小時的時間,在 List<T> 裡寫了兩個擴充方法,一個是儲存的  SaveToDisk<T>(this List<T> list)、另一個是 LoadFromDisk<T>(this List<T> list) ,由於很簡單,筆者就直接列出程式碼,如下:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using System.Data;
   6:  using System.Reflection;
   7:  using System.IO;
   8:  
   9:  namespace MvcIQureyableTestApp1.Models
  10:  {
  11:      public static class ListExtensionMethod
  12:      {
  13:          static string XmlPath = Path.Combine(
  14:              Path.GetDirectoryName(HttpContext.Current.Request.PhysicalApplicationPath), 
  15:              "IListDB.XML");
  16:          /// <summary>
  17:          /// 將 List<T> 轉換為 DataSet 並存為XML檔案.
  18:          /// </summary>
  19:          /// <typeparam name="T"></typeparam>
  20:          /// <param name="list"></param>
  21:          public static int SaveToDisk<T>(this List<T> list)
  22:          {
  23:              int result = 0;
  24:              DataTable dt = new DataTable();
  25:              if (list.Count > 0)
  26:              {
  27:                  Type obj = list.Take(1).Single().GetType();     //若有資料,
  28:                  PropertyInfo [] pInfo = obj.GetProperties();
  29:                  dt.TableName = obj.Name;
  30:  
  31:                  foreach (PropertyInfo info in pInfo)
  32:                  {
  33:                      if (info.MemberType == MemberTypes.Property)
  34:                      {
  35:                          dt.Columns.Add(new DataColumn(info.Name));
  36:                      }
  37:                  }
  38:              }
  39:              else
  40:                  return result;
  41:  
  42:              foreach (var p in list)
  43:              {
  44:                  PropertyInfo[] pPty = p.GetType().GetProperties();
  45:  
  46:                  DataRow dr = dt.NewRow();
  47:  
  48:                  foreach (PropertyInfo pp in pPty)
  49:                  {
  50:                      if (pp.MemberType == MemberTypes.Property)
  51:                      {        
  52:                          dr[pp.Name] = pp.GetValue(p, null);
  53:                      }
  54:                  }
  55:                  dt.Rows.Add(dr);
  56:                  result++;
  57:              }
  58:              dt.WriteXml(XmlPath);
  59:  
  60:              return result;
  61:          }
  62:          /// <summary>
  63:          /// 從磁碟讀取 DataSet 的 XML 檔案.
  64:          /// </summary>
  65:          /// <typeparam name="T"></typeparam>
  66:          /// <param name="list"></param>
  67:          public static List<T> LoadFromDisk<T>(this List<T> list)
  68:          {
  69:              List<T> t = new List<T>();
  70:  
  71:              DataSet ds = new DataSet();
  72:              ds.ReadXml(XmlPath);
  73:              DataTable dt = ds.Tables["Products"]; //new DataTable("Products");
  74:              //dt.ReadXml(XmlPath);
  75:              foreach (DataRow dr in dt.Rows)
  76:              {
  77:                  T p = Activator.CreateInstance<T>();
  78:                  foreach(DataColumn col in dt.Columns)
  79:                  {
  80:                      Type pType = p.GetType();
  81:                      PropertyInfo pInfo = pType.GetProperty(col.ColumnName);
  82:                      if (pInfo.PropertyType == typeof(System.Int32))
  83:                      {
  84:                          pInfo.SetValue(p, Convert.ToInt32(dr[col.ColumnName]), null);
  85:                      }
  86:                      else
  87:                      {
  88:                          pInfo.SetValue(p, dr[col.ColumnName], null);
  89:                      }
  90:                  }
  91:                  t.Add(p);
  92:              }
  93:              return t;
  94:          }
  95:      }
  96:  }

因此我的 ProductsRespository.cs 在 Add() 的時候,只需要叫用 pPuct 的 SaveToDisk<Products>() 即可!如下:

   1:          private List<Products> pPuct = new List<Products>();
   2:          List<Products> GetList()
   3:          {
   4:              pPuct = pPuct.LoadFromDisk<Products>();
   5:              return pPuct.ToList<Products>();
   6:          }
   7:  
   8:          public int Add(Products puct)
   9:          {
  10:              pPuct = GetList();
  11:              pPuct.Add(puct);
  12:              return pPuct.SaveToDisk<Products>();
  13:          }

其他什麼事都不必做,我就可以 DEMO 一些畫面了。可以新增、修改、刪除,如同操作資料庫一般。

image

 

結語:

小技巧應用,有需要的朋友可以直接將程式碼拿過去使用。


 

簽名:

學習是一趟奇妙的旅程

這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。

軟體開發之路(FB 社團)https://www.facebook.com/groups/361804473860062/

Gelis 程式設計訓練營(粉絲團)https://www.facebook.com/gelis.dev.learning/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^