會分享這一篇是因為筆者常常在測試一些 MVC 的程式,有時筆者只是很快的畫一個 Class Diagram ,很直覺的直接套用到 View 上頭,直接套 CRUD 看結果,如果我可以直接存入如 List
會分享這一篇是因為筆者常常在測試一些 MVC 的程式,因為筆者真的很懶XD,有時筆者只是很快的畫一個 Class Diagram 。如下:
很直覺的直接套用到 View 上頭,直接套 CRUD 看結果,顯然的是直接處理 List<T> 類型的物件,但因為有時只是個小測試,只是想測試畫面的效果而已。可是不開 EDM 或 將資料存入 DB 又很難做出 CRUD 的效果,有時要給客戶看東西或是 DMEO 都挺麻煩的。
為了使畫面我可以直接存入如 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 一些畫面了。可以新增、修改、刪除,如同操作資料庫一般。
結語:
小技巧應用,有需要的朋友可以直接將程式碼拿過去使用。
簽名:
學習是一趟奇妙的旅程
這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。
軟體開發之路(FB 社團):https://www.facebook.com/groups/361804473860062/
Gelis 程式設計訓練營(粉絲團):https://www.facebook.com/gelis.dev.learning/
如果文章對您有用,幫我點一下讚,或是點一下『我要推薦』,這會讓我更有動力的為各位讀者撰寫下一篇文章。
非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^