zoukankan      html  css  js  c++  java
  • 2语法基础_反射, 用反射来实现简单的手写orm小框架

    反射的作用:通过微软提供的类,让我们可以直接在代码里面访问 别人已经编译好的dll,

          最大的作用就是和其他语法结合起来做成动态形式 如:反射+泛型,动态访问数据库

                                  反射+表达式目录树,DTO动态转换

    ORM:就是在c#里面把数据库的表直接当做对象来操作使用

    1:反射的定义:微软提供的一个帮助类库,为了让我们不用在vs里面添加引用从而直接动态加载dll 去用里面的方法  

    2:反射的应用领域:MVC  AOP  IOC  ORM  Attribute  都是使用了反射

    反射特点:
    动态 减少对象和对象之间的依赖,只需要知道类名(字符串)、方法名(字符串),就可以调用,
    还可以突破特定权限,可以做到普通方式无法做到的
    编写比较困难,代码量大,编写的时候容易出错
    性能问题,性能损耗大, 可以进行缓存优化,但是还是会相差十多倍的性能

    3:使用反射创建对象:反射+简单工厂+配置文件 实现简单数据库访问

     Console.WriteLine("最基本使用反射调用类方法");
                        // 1、动态加载
                        Assembly assembly = Assembly.Load("类库");// dll名称  默认到当前目录下查找
                        //2、获取类型
                        Type type = assembly.GetType("类库.类");
                        //3、创建对象
                        object oDbHelper = Activator.CreateInstance(type);
    
                        dynamic dDbHelper = Activator.CreateInstance(type);
                        dDbHelper.Query(); //dynamic 是一个动态类型,可以避开编译器的检查,运行时检查  存在安全问题 因为c#是强类型语言,一般在编译时就会检测
                        //4、类型转换
                        IDBHelper iDBHelper = oDbHelper as IDBHelper;
                        //5、调用方法
                        iDBHelper.Query();
    最基本使用反射调用类方法
                        Assembly assembly = Assembly.Load("类库");
                        Type type = assembly.GetType("类库.类名");
                        object oTest = Activator.CreateInstance(type);
    
                        MethodInfo show1 = type.GetMethod("Show1");
                        //得到方法
                        //调用方法为什么一定要类型转换? 
                        //需要先获取方法,然后方法Invoke
                        show1.Invoke(oTest, new object[0]);// 反射调用方法 
    反射调用类.方法
       //泛型编译之后生成占位符  `1   `2    `3
                        //正常调用
                        GenericMethod genericMethod = new GenericMethod();
                        genericMethod.Show<int, string, DateTime>(1234, "", DateTime.Now);
    
                        //使用反射调用
                        Assembly assembly = Assembly.Load("类库");
                        Type type = assembly.GetType("类库.类名");
                        object oTest = Activator.CreateInstance(type);
                        MethodInfo genericMethod = type.GetMethod("Show");
                        MethodInfo genericMethod1 = genericMethod.MakeGenericMethod(new Type[] { typeof(int), typeof(string), typeof(DateTime) });// 指定泛型方法的  具体参数 
                        genericMethod1.Invoke(oTest, new object[] { 123, "11", DateTime.Now }); // 传入参数必须和声明的一样
    反射调用泛型方法
    private static string Customers = ConfigurationManager.ConnectionStrings["Customers"].ToString();
    
            /// <summary>
            /// 泛型方法
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="id"></param>
            /// <returns></returns>
            public static T Find<T>(int id)   
            {
                //string sql = @"SELECT   [Id]
                //      ,[Name]
                //      ,[CreateTime]
                //      ,[CreatorId]
                //      ,[LastModifierId]
                //      ,[LastModifyTime]
                //  FROM [SystemDB].[dbo].[Company] where Id=" + id;
    
                Type type = typeof(T);
                object oCompany = Activator.CreateInstance(type);
                //List<string> 
                var propNames = type.GetProperties().Select(a => $"[{a.Name}]");
                string props = string.Join(",", propNames);
                string sql = $"SELECT {props } FROM [{type.Name}] where Id={id}"; 
                using (SqlConnection connection = new SqlConnection(Customers))
                {
                    SqlCommand sqlCommand = new SqlCommand(sql, connection);
                    connection.Open();
                    SqlDataReader reader = sqlCommand.ExecuteReader();
                    if (reader.Read()) //开始读取
                    {
                        foreach (var prop in type.GetProperties())
                        {
                            prop.SetValue(oCompany, reader[prop.Name]);
                        }
                    }
                }
                return (T)oCompany;
            }
    反射+泛型 实现通用简单数据库访问
       Assembly assembly = Assembly.Load("类库");
                        Type type = assembly.GetType("类库。类名");
    
                        //Activator.CreateInstance 
                        object oDbHelper = Activator.CreateInstance(type);
                        object oDbHelper1 = Activator.CreateInstance(type, new object[] { "杰克" });
                        object oDbHelper2 = Activator.CreateInstance(type, new object[] { "我是谁" });
                        object oDbHelper3 = Activator.CreateInstance(type, new object[] { 123 });
                    }
    反射选择不同的构造函数创建对象

      

     

     

     

  • 相关阅读:
    ADT上跑java application
    GIT 用RSA加密方式来记住密码
    android中listView下有Button按钮始终在最底部
    Android学习:导入工程时报错The import android cannot be resolved
    Preference的使用
    MySQL查询时,查询结果如何按照where in数组排序
    MySQL创建民族表的SQL语句
    PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现
    使用file_get_contents()和curl()抓取网络资源的效率对比
    常用正则表达式整理(持续更新中)
  • 原文地址:https://www.cnblogs.com/LZXX/p/12957296.html
Copyright © 2011-2022 走看看