反射
反射反射程序员的快乐,反射是无处不在的,封装框架,系统开发,MVC,IOC,ORM都离不开反射。
一、反射/反编译工具/高级语言到计算机语言的历程
- 高级语言---编译---dll/exe文件
- metadata:元数据清单---记录了dll中包含哪些东西,是一个描述。
- IL:中间语言---编译把高级语言编译后得到c#中最真实的言语状态,面向对象语言。
- 反编译工具:逆向工程;ILSPY --- DLL/EXE、 --- 反编译回来,c#/IL
- 反射: 来自于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();