本文的意義並不僅僅是為了說明如何將IList轉換為DataTable,而是給出一個利用反射來實現對各種數據結構(集合類)相互轉換的通用方法的編寫思路。
相信很多使用過Nhibernate的朋友都知道,通過NH訪問數據庫,數據都是以ILIST形式返回的,這就為我們在.Net中使用傳統的數據綁定造成了不便。由於NH返回的ILIST所裝載的對象往往都是不同的,我們會為每個返回的LIST單獨編寫轉換方法,而利用反射機制卻可以做成通用的轉換方法。
代碼如下(C#):
...{
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的幾行。
希望本文能夠為需要進行數據轉換的朋友提供些靈感。