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 });
                }
反射选择不同的构造函数创建对象

  

 

 

 

原文地址:https://www.cnblogs.com/LZXX/p/12957296.html