DataTableをIList(二)に変換

13511 ワード

作者:陳太漢
DataTableをIList(二)に変換
DataTableをIList第1版に変換が出てきてから、昨夜はいつも改善できるところがたくさんあると思っていたので、今日は朝早くから修正しました.もちろん改善できるところもあります.私がコード能力を高めてから第3版を出しましょう.第2版は十分だと思います.
 
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Collections;
using System.Data;

namespace JSONTest
{
public class TableToList<T> where T : new()
{
/// <summary>
/// DataTable IList
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public IList<T> ToList(DataTable dt)
{
if (dt == null || dt.Rows.Count == 0)
{
return null;
}

PropertyInfo[] properties
= typeof(T).GetProperties();//
IList<string> colNames = GetColumnNames(dt.Columns);//
List<T> list = new List<T>();
T model
= default(T);
foreach (DataRow dr in dt.Rows)
{
model
= new T();//
int i = 0;
foreach (PropertyInfo p in properties)
{
if (p.PropertyType == typeof(string))
{
p.SetValue(model, dr[colNames[i
++]], null);
}
else if (p.PropertyType == typeof(int))
{
p.SetValue(model,
int.Parse(dr[colNames[i++]].ToString()), null);
}
else if (p.PropertyType == typeof(bool))
{
p.SetValue(model,
bool.Parse(dr[colNames[i++]].ToString()), null);
}
else if (p.PropertyType == typeof(DateTime))
{
p.SetValue(model, DateTime.Parse(dr[colNames[i
++]].ToString()), null);
}
else if (p.PropertyType == typeof(float))
{
p.SetValue(model,
float.Parse(dr[colNames[i++]].ToString()), null);
}
else if (p.PropertyType == typeof(double))
{
p.SetValue(model,
double.Parse(dr[colNames[i++]].ToString()), null);
}
}

list.Add(model);
}

return list;
}


/// <summary>
///
/// </summary>
private IList<string> GetColumnNames(DataColumnCollection dcc)
{
PropertyInfo[] properties
= typeof(T).GetProperties();//

// , , ,
IList<string> ilist = new List<string>(dcc.Count);

foreach (PropertyInfo p in properties)
{
foreach (DataColumn dc in dcc)
{
if (dc.ColumnName.ToLower().Contains(p.Name.ToLower()))
{
ilist.Add(dc.ColumnName);
}
}
}

return ilist;
}

}
}