轉帖|其它|編輯:郝浩|2010-09-19 11:43:38.000|閱讀 930 次
概述:本文的意義并不僅僅是為了說明如何將IList轉換為DataTable,而是給出一個利用反射來實現對各種數據結構(集合類)相互轉換的通用方法的編寫思路。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
本文的意義并不僅僅是為了說明如何將IList轉換為DataTable,而是給出一個利用反射來實現對各種數據結構(集合類)相互轉換的通用方法的編寫思路。
相信很多使用過Nhibernate的朋友都知道,通過NH訪問數據庫,數據都是以ILIST形式返回的,這就為我們在.NET中使用傳統的數據綁定造成了不便。由于NH返回的ILIST所裝載的對象往往都是不同的,我們會為每個返回的LIST單獨編寫轉換方法,而利用反射機制卻可以做成通用的轉換方法。
代碼如下(C#):
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using System.Reflection;
namespace KycBaseModule
...{
public class KycFunction
...{
public KycFunction() ...{ }
/**//// <summary>
/// 實現對IList到DataSet的轉換
/// </summary>
/// <param name="ResList">待轉換的IList</param>
/// <returns>轉換后的DataSet</returns>
public static DataSet ListToDataSet(IList ResList)
...{
DataSet RDS=new DataSet();
DataTable TempDT = new DataTable();
//此處遍歷IList的結構并建立同樣的DataTable
System.Reflection.PropertyInfo[] p = ResList[0].GetType().GetProperties();
foreach (System.Reflection.PropertyInfo pi in p)
...{
TempDT.Columns.Add(pi.Name,System.Type.GetType(pi.PropertyType.ToString()));
}
for (int i = 0; i < ResList.Count; i++)
...{
IList TempList = new ArrayList();
//將IList中的一條記錄寫入ArrayList
foreach (System.Reflection.PropertyInfo pi in p)
...{
object oo = pi.GetValue(ResList[i], null);
TempList.Add(oo);
}
object[] itm=new object[p.Length];
//遍歷ArrayList向object[]里放數據
for (int j = 0; j < TempList.Count; j++)
...{
itm.SetValue(TempList[j], j);
}
//將object[]的內容放入DataTable
TempDT.LoadDataRow(itm, true);
}
//將DateTable放入DataSet
RDS.Tables.Add(TempDT);
//返回DataSet
return RDS;
}
}
}
由上面的代碼可以看出,實現的過程非常簡單。首先利用反射,將傳入方法的IList中的對象所包含的屬性進行獲取,然后根據獲取的屬性建立DataTable的Columns,然后利用循環遍歷整個IList,將每個結點對象所包含的內容依次復制到DataTable。由于該代碼取自真實的項目模塊,所以保留了原有的命名空間和將DataTable放入Dataset的幾行。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載