2020年12月3日 星期四

【C#】DataTable轉List與List轉Datatable

最近的案子很鳥,為了配合原本的撰寫模式,只好創一個檢核用的Data Model去記錄每一欄的檢核結果,但是,好玩的來了,等到要秀出錯誤訊息時咋辦呢?每個Data Model又都長不一樣!

但是,能轉成DataTable就不同了,至少能用foreach配合Row跟Column的方式去取值出來組字串,所以,上網逛了一下,找到這段語法~



參考來源:https://www.itread01.com/content/1503051736.html


    /// <summary>
    /// 模型轉換類
    /// </summary>
    public class ConvertModel
    {
        /// <summary>
        /// DataTable轉List
        /// </summary>
        /// <typeparam name="T">list中的類型</typeparam>
        /// <param name="dt">要轉換的DataTable</param>
        /// <returns></returns>
        public static List<T> DatatTableToList<T>(DataTable dt) where T : class, new()
        {
            List<T> list = new List<T>();
            T t = new T();
            PropertyInfo[] prop = t.GetType().GetProperties();
            //遍歷所有DataTable的行
            foreach (DataRow dr in dt.Rows)
            {
                t = new T();
                //通過反射獲取T類型的所有成員
                foreach (PropertyInfo pi in prop)
                {
                    //DataTable列名=屬性名
                    if (dt.Columns.Contains(pi.Name))
                    {
                        //屬性值不為空
                        if (dr[pi.Name] != DBNull.Value)
                        {
                            object value = Convert.ChangeType(dr[pi.Name], pi.PropertyType);
                            //給T類型字段賦值
                            pi.SetValue(t, value, null);
                        }
                    }
                }
                //將T類型添加到集合list
                list.Add(t);
            }
            return list;

        }

        /// <summary>
        /// List轉換為DataTable
        /// </summary>
        /// <typeparam name="T">List中的類型</typeparam>
        /// <param name="list">要轉換的list</param>
        /// <returns></returns>
        public static DataTable ListToDataTable<T>(List<T> list) where T : class
        {
            DataTable dt = new DataTable();
            PropertyInfo[] prop = typeof(T).GetProperties();
            DataColumn[] ColumnArr = prop.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray();
            dt.Columns.AddRange(ColumnArr);
            foreach (T t in list)
            {
                DataRow dr = dt.NewRow();
                foreach (PropertyInfo pi in prop)
                {
                    if (dt.Columns.Contains(pi.Name))
                    {
                        if (pi.GetValue(t) != null)
                        {
                            dr[pi.Name] = pi.GetValue(t);
                        }
                    }
                }
                dt.Rows.Add(dr);
            }

            return dt;
        }
    }

沒有留言:

張貼留言