反射

发布时间 2023-04-05 18:10:40作者: 飘雨的河

反射

反射反射程序员的快乐,反射是无处不在的,封装框架,系统开发,MVC,IOC,ORM都离不开反射。

一、反射/反编译工具/高级语言到计算机语言的历程

  1. 高级语言---编译---dll/exe文件
  2. metadata:元数据清单---记录了dll中包含哪些东西,是一个描述。
  3. IL:中间语言---编译把高级语言编译后得到c#中最真实的言语状态,面向对象语言。
  4. 反编译工具:逆向工程;ILSPY --- DLL/EXE、 --- 反编译回来,c#/IL
  5. 反射: 来自于System.Reflection,是一个帮助类库---可以读取DLL/EXE中metadata和使用metadata + 动态的创建dll/exe --- Emit技术

二、反射创建对象

首先定义一个接口

namespace Business.DB.Interface
{
    /// <summary>
    /// 数据访问类抽象
    /// </summary>
    public interface IDBHelper
    {
        void Query();
    }
}

实现了接口的类

namespace Business.DB.SqlServer
{
    public class SqlServerHelper
    {
        //Nuget:System.Data.SqlClient

        private string ConnectionString = "Data Source=DESKTOP-VUL99EF; Database=CustomerDB; User ID=sa; Password=sa123; MultipleActiveResultSets=True";

        private static string GetConnection()
        {
            //Nuget引入:
            //SetBasePath:Microsoft.Extensions.Configuration.FileExtensions
            //AddJsonFile:Microsoft.Extensions.Configuration.Json 
            var Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true)
                .Build();
            return Configuration.GetConnectionString("Default");
        }


        public SqlServerHelper()
        {
            Console.WriteLine($"{this.GetType().Name}被构造");
        }

        //public SqlServerHelper(int i)
        //{
        //    Console.WriteLine($"{this.GetType().Name}被构造");
        //}

        public void Query()
        {
            Console.WriteLine($"{this.GetType().Name}.Query");
        }
    }
}

我们开始尝试通过反射创建对象

//传统方式创建对象
IDBHelper dbHelper=new SqlServerHelper();