1 什么是反射

 我所理解的反射,程序运行时动态的去获取程序集里的类、其中的方法,或者获取一个类里的属性、方法。

我们用VS开发项目,引用一个DLL时,可以看到这个程序集里的方法,这其实就是VS自带的反射实现的,自动反射出其中的属性方法等等。

如果是在运行时才动态去引用别的程序集呢?这时候就需要用到反射了。

再例如,常用到的有把一个Datatable中的数据填充到实体类列表中。

常规的用 user.Name=dr["Name"].Tostring();自己写代码去对应,如果代码量很多,对性能要求不是太高的时候也可以用反射来完成。

下边列出简单处理代码,大家可以看看

 public class User
    {
        public string Name { get; set; }

        public int Id { get; set; }

        public double Money { get; set; }
        public DateTime AddTime { get; set; }
    }
public  List<T> ConvertDatableToList<T>(DataTable dt)
        {
            if (dt == null)
            {//为空,无列直接返回null
                return null;
            }
            List<T> list = new List<T>();
            int intLen = dt.Rows.Count;

            ///循环DataTable中的每一行,进行处理
            for (int i = 0; i < intLen; i++)
            {
                T obj = default(T);

                obj = Activator.CreateInstance<T>();//创建类的一个实例

                ///循环DataTable的列,用列名与对应实体类中的属性名字,一般情况下不要反过来赋值
                foreach (DataColumn column in dt.Columns)
                {
                    PropertyInfo info = obj.GetType().GetProperty(column.ColumnName);//获取实体类中的属性集合
                    try
                    {
                        object value = dt.Rows[i][column.ColumnName];//取出该列的值
                        info.SetValue(obj, value, null);//用索引属性的可选索引值设置该属性的值
                    }
                    catch (Exception ex)
                    {

                    }
                }
                list.Add(obj);
            }

            return list;
        }
 1  private void test_Click(object sender, RoutedEventArgs e)
 2         {
 3             DataTable dt = new DataTable();
 4             dt.Columns.Add("Name", Type.GetType("System.String"));
 5             dt.Columns.Add("Id", Type.GetType("System.Int32"));
 6             dt.Columns.Add("Money", Type.GetType("System.Double"));
 7             dt.Columns.Add("AddTime", Type.GetType("System.DateTime"));
 8 
 9             DataRow dr = null;
10             for (int i = 0; i < 3; i++) {
11 
12                 dr = dt.NewRow();
13 
14                 dr[0] = ""+i.ToString();
15                 dr[1] = i;
16                 dr[2] = i*0.003;
17                 dr[3] = DateTime.Now; 
18                 dt.Rows.Add(dr);
19             }
20 
21             List<User> list = ConvertDatableToList<User>(dt);
22         }

今天先写到这里,下次继续。


 

 

posted on 2015-04-03 14:49  Gotta  阅读(347)  评论(0编辑  收藏  举报