首页 新闻 会员 周边

高手帮我解释一小段高难度代码,利用了反射和泛型技术

0
悬赏园豆:60 [已解决问题] 解决于 2010-06-24 17:46

这段代码实现把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;
        }

潇客的技术博客的主页 潇客的技术博客 | 初学一级 | 园豆:20
提问于:2010-06-24 14:57
< >
分享
最佳答案
0

问题确实很简单 :)

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

收获园豆:36
小洋(燕洋天) | 菜鸟二级 |园豆:206 | 2010-06-24 16:11
其他回答(4)
0

反射而已,没有用什么关键的技术.

 

甚至那个T obj的参数都是多余的.

 

//创建实体实例,更好的方法是加上泛型约束,直接new T();

T item = (T)Activator.CreateInstance(type);

 

//GetProperty:取得类型的某个属性

//SetProperty:设置类型的某个属性值到指定实例.

type.GetProperty(c.ColumnName).SetValue(item, tt.Rows[i][c], null);

 

这些在MSDN里都可以查到的.没事多翻翻.

收获园豆:10
I,Robot | 园豆:9783 (大侠五级) | 2010-06-24 15:05
0

这里面主要应用了泛型,T表示泛型。通俗的将就是眉毛胡子都可以用

泛型的定义http://msdn.microsoft.com/zh-cn/library/512aeb7t%28VS.80%29.aspx

TableToList<T>表示方法TableToList支持泛型T, 参数obj表示 输入的类型为泛型类型

里面的算法大致是通过反射获取泛型类型的属性,和DataTable的column匹配。

返回值是一个泛型类型的集合。

不知道以上答案,您是否满意

收获园豆:10
蔡春升 | 园豆:3 (初学一级) | 2010-06-24 15:08
0

只要明白泛型和反射就一目了然了

收获园豆:2
luotong | 园豆:4 (初学一级) | 2010-06-24 15:18
0

楼上几位解释很清楚了。

收获园豆:2
Astar | 园豆:40805 (高人七级) | 2010-06-24 15:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册