• C# 反射


    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         }

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


     

  • 相关阅读:
    创建XNA Shooter游戏——概述
    Android 界面切换与恢复原生界面
    输入和用户界面——SpaceCamera类
    ASP.NET下FCKedit配置及使用参考
    1282. Game Tree 夜
    1122. Game 夜
    1136. Parliament 夜
    hdu 3905 Sleeping 夜
    1195. Ouths and Crosses 夜
    1210. Kind Spirits 夜
  • 原文地址:https://www.cnblogs.com/cad2/p/4390052.html
Copyright © 2020-2023  润新知