public List<T> DataSetToList<T>(DataSet ds, int tableIndext)
{
//確認參數有效
if (ds == null || ds.Tables.Count <= 0 || tableIndext < 0)
{
return null;
}
DataTable dt = ds.Tables[tableIndext]; //取得DataSet里的一個下標為tableIndext的表,然后賦給dt
IList<T> list = new List<T>(); //實例化一個list
// 在這里寫 獲取T類型的所有公有屬性。 注意這里僅僅是獲取T類型的公有屬性,不是公有方法,也不是公有字段,當然也不是私有屬性
PropertyInfo[] tMembersAll = typeof(T).GetProperties();
for (int i = 0; i < dt.Rows.Count; i++)
{
//創建泛型對象。為什么這里要創建一個泛型對象呢?是因為目前我不確定泛型的類型。
T t = Activator.CreateInstance<T>();
//獲取t對象類型的所有公有屬性。但是我不建議吧這條語句寫在for循環里,因為沒循環一次就要獲取一次,占用資源,所以建議寫在外面
//PropertyInfo[] tMembersAll = t.GetType().GetProperties();
for (int j = 0; j < dt.Columns.Count; j++)
{
//遍歷tMembersAll
foreach (PropertyInfo tMember in tMembersAll)
{
//取dt表中j列的名字,並把名字轉換成大寫的字母。整條代碼的意思是:如果列名和屬性名稱相同時賦值
if (dt.Columns[j].ColumnName.ToUpper().Equals(tMember.Name.ToUpper()))
{
//dt.Rows[i][j]表示取dt表里的第i行的第j列;DBNull是指數據庫中當一個字段沒有被設置值的時候的值,相當於數據庫中的“空值”。
if (dt.Rows[i][j] != DBNull.Value)
{
//SetValue是指:將指定屬性設置為指定值。 tMember是T泛型對象t的一個公有成員,整條代碼的意思就是:將dt.Rows[i][j]賦值給t對象的tMember成員,參數詳情請參照http://msdn.microsoft.com/zh-cn/library/3z2t396t(v=vs.100).aspx/html
tMember.SetValue(t, dt.Rows[i][j], null);
}
else
{
tMember.SetValue(t, null, null);
}
break;//注意這里的break是寫在if語句里面的,意思就是說如果列名和屬性名稱相同並且已經賦值了,那么我就跳出foreach循環,進行j+1的下次循環
}
}
}
list.Add(t);
}
return list.ToList();
}
