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 }
今天先写到这里,下次继续。
每天一小步,日后一大步。