public static class ExtensionMethods{/// <summary>/// 將List轉換成DataTable/// </summary>/// <typeparam name="T"></typeparam>/// <param name="data"></para ...
public static class ExtensionMethods
{
/// <summary>
/// 將List轉換成DataTable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <returns></returns>
public static DataTable ToDataTable<T>(this IList<T> data)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
DataTable dt = new DataTable();
for (int i = 0; i < properties.Count; i++)
{
PropertyDescriptor property = properties[i];
dt.Columns.Add(property.Name, property.PropertyType);
}
object[] values = new object[properties.Count];
foreach (T item in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = properties[i].GetValue(item);
}
dt.Rows.Add(values);
}
return dt;
}
/// <summary>
/// DataTable轉泛型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt">DataTable</param>
/// <returns></returns>
public static List<T> ToList<T>(this DataTable dt) where T : class, new()
{
//獲取類
Type t = typeof(T);
//反射 using System.Reflection;
//獲取當前Type的公共屬性
PropertyInfo[] propertys = t.GetProperties();
List<T> list = new List<T>();
//欄位名稱
string typeName = string.Empty;
//遍歷DataTable每行
foreach (DataRow dr in dt.Rows)
{
//創建實體
T entity = new T();
//遍歷實體的公共屬性
foreach (PropertyInfo pi in propertys)
{
//將欄位名稱賦值
typeName = pi.Name;
if (dt.Columns.Contains(typeName))
{
//獲取一個值,該值指定此屬性是否可寫 set
if (!pi.CanWrite) continue;
//根據欄位名稱獲取對應值
object value = dr[typeName];
//若不存在 則跳出
if (value == DBNull.Value) continue;
//獲取此屬性的類型是否是string類型
if (pi.PropertyType == typeof(string))
{
//PropertyInfo.SetValue()三個參數
//第一個 將設置其屬性值的對象。
//第二個 新的屬性值。
//第三個 索引化屬性的可選索引值。 對於非索引化屬性,該值應為 null。
pi.SetValue(entity, value.ToString(), null);
}
else if (pi.PropertyType == typeof(int))
{
//寫入
pi.SetValue(entity, int.Parse(value.ToString()), null);
}
else if (pi.PropertyType == typeof(DateTime))
{
//寫入
pi.SetValue(entity, DateTime.Parse(value.ToString()), null);
}
else
{
pi.SetValue(entity, value, null);
}
}
}
//加入泛型末尾
list.Add(entity);
}
return list;
}
}