這個需求很簡單,自己創建dataset,datatable。把數據對象的field映射爲datatable的列,然後將一個對象轉化爲一條datarow。
不過我發現,這個被傳送的數據對象SESGMemberShipUser可能經常要變化,比如增加個屬性什麼的,這就比較麻煩了。因爲每次當SESGMemberShipUser修改後,我都要重新將數據對象轉換爲dataset。
這時,套用一句流行廣告。多虧有了反射,它的動態調用,能自如地應付這種變化,讓我能安心地睡個好覺:)
public DataSet GetUsersInRole(string role)
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
ds.Tables.Add(dt);
//第一步,使用反射,獲取SESGMemberShipUser的屬性的名字和數據類型,在datatable中爲這些屬性創建對應的datacolumn。
Type theType = Type.GetType("SESGMemberShipUser");
// get all fields
PropertyInfo[] InfoArray = theType.GetProperties();
foreach (PropertyInfo Info in InfoArray)
{
dt.Columns.Add(new DataColumn(Info.Name, Info.PropertyType));//insert the data into the table
}
//第二步,從業務層取得數據對象的集合,然後將每個對象作爲一條記錄,插入到新創見的datatable中。
SESGMemberShipUserCollection users = SESG.Security.SESGRoles.GetSESGUsersInRole(role);
for (int i = 0; i < users.Count; i++)
{
SESGMemberShipUser user = users[i];
DataRow dr = dt.NewRow();
foreach (PropertyInfo Info in InfoArray)
{
dr[Info.Name] = Info.GetValue(user,null);
}
dt.Rows.Add(dr);
}
ds.AcceptChanges();
return ds;
}