这段代码实现把DATATABLE转换为LIST,实体的功能,很好很强大,可是代码看不懂,想研究一下,哪位大侠能帮我解释一下,最好到每行代码,越详细越好,或者提一些关键的技术定义,我回去查查资料学习,谢谢。。
private List<T> TableToList<T>(T obj, DataTable tt)
{
System.Type type = obj.GetType();
List<T> list = new List<T>();
for (int i = 0; i < tt.Rows.Count; i++)
{
T item = (T)Activator.CreateInstance(type);
object value;
foreach (DataColumn c in tt.Columns)
{
value = tt.Rows[i][c];
if (value != System.DBNull.Value)
{
type.GetProperty(c.ColumnName).SetValue(item, tt.Rows[i][c], null);
}
}
list.Add(item);
}
return list;
}
问题确实很简单 :)
1. System.Type type = obj.GetType(); 获取类型信息,例如,你想把DataTable最后转换为List<Product>,那么这里的T 的Type就是Product.
2. List<T> list = new List<T>(); 定义你要返回的列表,如上面提到的
List<Product>,因为DataTable的每一行的数据就可以填充一个对象,DataTable所有的数据当然就得返回为List了。
3 . T item = (T)Activator.CreateInstance(type); 根据之前获取的类型信息创建一个实例,你在程序中用的肯定就是对象的实例。
4..
object value;
foreach (DataColumn c in tt.Columns)
{
value = tt.Rows[i][c];
if (value != System.DBNull.Value)
{
type.GetProperty(c.ColumnName).SetValue(item, tt.Rows[i][c], null);
}
}
看到 type.GetProperty(c.ColumnName).SetValue(item, tt.Rows[i][c], null);分解如下:
type.GetProperty(c.ColumnName)(通过属性的名字) 获取之前创建的那个实例的属性的信息,注意:你的实体类的的属性名必须和数据库中表的列名一样。
SetValue(item, tt.Rows[i][c], null); 给属性赋值
OK
反射而已,没有用什么关键的技术.
甚至那个T obj的参数都是多余的.
//创建实体实例,更好的方法是加上泛型约束,直接new T();
T item = (T)Activator.CreateInstance(type);
//GetProperty:取得类型的某个属性
//SetProperty:设置类型的某个属性值到指定实例.
type.GetProperty(c.ColumnName).SetValue(item, tt.Rows[i][c], null);
这些在MSDN里都可以查到的.没事多翻翻.
这里面主要应用了泛型,T表示泛型。通俗的将就是眉毛胡子都可以用
泛型的定义http://msdn.microsoft.com/zh-cn/library/512aeb7t%28VS.80%29.aspx
TableToList<T>表示方法TableToList支持泛型T, 参数obj表示 输入的类型为泛型类型
里面的算法大致是通过反射获取泛型类型的属性,和DataTable的column匹配。
返回值是一个泛型类型的集合。
不知道以上答案,您是否满意
只要明白泛型和反射就一目了然了
楼上几位解释很清楚了。