最近的案子很鳥,為了配合原本的撰寫模式,只好創一個檢核用的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;
}
}
沒有留言:
張貼留言