/// <summary>
/// 由一个List<T>得到一个DataTable,方法名ToDataTable<T>这是一个泛型方法 T是泛型参数 给什么类(型)参数,就是什么类 typeof(..)是反射知识的一部分
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="items"></param>
/// <returns></returns>
public static DataTable ToDataTable<T>(List<T> items)
{
DataTable dataTable = new DataTable(typeof(T).Name);//实例化一个名为Computer的Datatable
// 获取所有公共属性 typeof(T)获取T类型的对象或转成Type类型的一个对象 T泛型类型参数,代表任何类型 GetProperties,是Type类的一个方法,用于获取类型下所有属性(公有,私有,受保护,内部,不包括静态属性)
//BindingFlags是枚举,控制反射绑定成员的方式标记,意为只返回T的公共成员和实例(非静态)成员 |按位或,解释为T的公共实例属性
PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
//Datatable表头
foreach (PropertyInfo prop in props)
{
// 创建一个DataColumn,绑定到props的属性
dataTable.Columns.Add(prop.Name, prop.PropertyType);
}
//Datatable表体
foreach (T item in items)
{
var values = new object[props.Length];
for (int i = 0; i < props.Length; i++)
{
values[i] = props[i].GetValue(item, null);
}
dataTable.Rows.Add(values);//创建Datatable的row,需要params object数组
}
return dataTable;
}