在大部分時候我們從ADO中得到的數據都是DataTable、DataSet數據源,然而有強迫癥的同學老是喜歡折騰,硬是要把它轉換為實體集合,說是DataTable效率差云云,于是乎收到了同化。
1,數據實體
public class UserInfo { public int ID { get; set; } public string name { get; set; } }
2,數據源(想象成從庫中得到的數據)
DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ID", typeof(int))); dt.Columns.Add(new DataColumn("name", typeof(string))); for (int i = 0; i < 10; i++) { DataRow dr = dt.NewRow(); dr["ID"] = i.ToString(); dr["name"] = "name" + i.ToString(); dt.Rows.Add(dr); }
轉換的核心很簡單,傳入獲取到的數據源與一個Func<DataRow, UserInfo>委托即可
public List<T> DtToList<T>(DataTable dt, Func<DataRow, T> fun) { List<T> list = new List<T>(); foreach (DataRow dr in dt.Rows) { list.Add(fun(dr)); } return list; }
在調用時只需要構建一個Func<DataRow, UserInfo>委托
Func<DataRow, UserInfo> fun = x => new UserInfo() { ID = Convert.ToInt32(x["ID"]), name = x["name"].ToString() };
調用
var list = DtToList<UserInfo>(dt, fun);
或許有人會說,你這樣轉換無非是吧原先底層的轉換換了個位置嘛。
確實,只是換了個位置。但是,有很多同學在做ORM的轉換時通過反射或者Emit去賦值?
試想下,如果我們為一些特定的類編寫一個轉換的委托,讓后以上述形式去給實體賦值,這豈不快哉?
新聞熱點
疑難解答