/// <summary>
/// LIST 转DATATABLE
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="tableName">指定表名</param>
/// <returns></returns>
public static DataTable ToDataTable<T>(this IList<T> list, string tableName = "")
{
DataTable dt = new DataTable();
if (typeof(T).Name == "")
{
dt.TableName = typeof(T).Name;
}
else
{
dt.TableName = tableName;
}
DataColumn column;
DataRow row;
System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
foreach (T t in list)
{
if (t == null)
{
continue;
}
row = dt.NewRow();
for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
{
System.Reflection.PropertyInfo pi = myPropertyInfo[i];
string name = pi.Name;
if (dt.Columns[name] == null)
{
// column = new DataColumn(name, pi.PropertyType);
column = new DataColumn(name);
dt.Columns.Add(column);
}
row[name] = pi.GetValue(t, null);
}
dt.Rows.Add(row);
}
return dt;
}
public static IList<string> GetColumnNames(this DataTable dt)
{
DataColumnCollection dcc = dt.Columns;
//由于集合中的元素是确定的,所以可以指定元素的个数,系统就不会分配多余的空间,效率会高点
IList<string> list = new List<string>(dcc.Count);
foreach (DataColumn dc in dcc)
{
list.Add(dc.ColumnName);
}
return list;
}
/// <summary>
/// 行转Model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="row"></param>
/// <returns></returns>
public static T Row2Mode<T>(System.Data.DataRow row)
{
T rmodel = (T)Activator.CreateInstance(typeof(T));
Dictionary<string, Dictionary<string, object>> dic = new Dictionary<string, Dictionary<string, object>>();
for (int i = 0; i < row.Table.Columns.Count; i++)
{
var columnName = row.Table.Columns[i].ColumnName.Split('.');
if (columnName.Length == 2)
{
if (!dic.ContainsKey(columnName[0])) dic.Add(columnName[0], new Dictionary<string, object>());
if (!dic[columnName[0]].ContainsKey(columnName[1])) dic[columnName[0]].Add(columnName[1], row[i]);
}
else if (columnName.Length == 1)
{
if (!dic.ContainsKey(rmodel.GetType().Name)) dic.Add(rmodel.GetType().Name, new Dictionary<string, object>());
if (!dic[rmodel.GetType().Name].ContainsKey(columnName[0])) dic[rmodel.GetType().Name].Add(columnName[0], row[i]);
}
}
foreach (var dick in dic.Keys)
{
if (rmodel.GetType().Name == dick)
{
foreach (var k in dic[dick].Keys)
{
var p = rmodel.GetType().GetProperty(k);
if (p != null && dic[dick][k] != System.DBNull.Value)
p.SetValue(rmodel, dic[dick][k], null);
}
}
else
{
var linkp = rmodel.GetType().GetProperty(dick);
if (linkp != null)
{
var sobj = Activator.CreateInstance(linkp.PropertyType);
if (linkp != null)
{
foreach (var k in dic[dick].Keys)
{
var p = linkp.PropertyType.GetProperty(k);
if (p != null && dic[dick][k] != System.DBNull.Value)
p.SetValue(sobj, dic[dick][k], null);
}
linkp.SetValue(rmodel, sobj, null);
}
}
}
}
return rmodel;
}