在最近做的一個案子裡,需要綁定實體數組比如Materiel[]綁定到介面(winform/webform都有),雖然可以直接綁定數組到GridView,但排序,過濾,尋找等操作在數組裡不是很方便。所以想借用DataTable做資料來源。
最簡單的方法就是手動建一個DataTable。為每個Materiel的property建一個Column,然後指明其資料類型。建好Table之後,迴圈為每個Materiel建立一個新行。如果多有幾個介面,雖然做起來都差不多,但代碼很難重用。
另外資料都是從WebService擷取,form不允許直接存取DB,所以也不能通過ADO.net擷取DataTable。
經過一段時間的考量後決定見一個專用的Utility類EntityCollectionsConvert,介面為
DataTable ToDataTable(object[] entitys);
DataTable ToDataTable<T>(List<T> entitys)
實現的原理也比較簡單
1.將判斷entitys不為空白;
2.取出entitys的所有property
3.在DataTable中為每個property添加一列(包括元素類型)
4.為每個entity添加一行。
5.自動產生單元測試,測試,添加到項目中
1 public static DataTable ToDataTable<T>(List<T> entitys)<br /> 2 {<br /> 3<br /> 4 //檢查實體集合不可為空<br /> 5 if (entitys ==null|| entitys.Count<1)<br /> 6 {<br /> 7 throw new Exception("需轉換的集合為空白");<br /> 8 }<br /> 9<br />10 //取出第一個實體的所有Propertie<br />11 Type entityType= entitys[0].GetType();<br />12 PropertyInfo[] entityProperties= entityType.GetProperties();<br />13<br />14 //產生DataTable的structure<br />15 //生產代碼中,應將產生的DataTable結構Cache起來,此處略<br />16 DataTable dt = new DataTable();<br />17 for (int i = 0; i < entityProperties.Length; i++)<br />18 {<br />19 dt.Columns.Add(entityProperties[i].Name,entityProperties[i].PropertyType);<br />20 }<br />21<br />22 //將所有entity添加到DataTable中<br />23 foreach (object entity in entitys)<br />24 {<br />25 //檢查所有的的實體都為同一類型<br />26 if (entity.GetType()!=entityType)<br />27 {<br />28 throw new Exception("要轉換的集合元素類型不一致");<br />29 }<br />30 object[] entityValues = new object[entityProperties.Length];<br />31 for (int i = 0; i < entityProperties.Length; i++)<br />32 {<br />33 entityValues[i] = entityProperties[i].GetValue(entity, null);<br />34<br />35 }<br />36 dt.Rows.Add(entityValues);<br />37 }<br />38 return dt;<br />39 }<br />