反射
Posted 飘雨的河
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射相关的知识,希望对你有一定的参考价值。
反射
反射反射程序员的快乐,反射是无处不在的,封装框架,系统开发,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();
反射的方式
- 动态读取DLL
- LoadFrom: dll全名称,需要后缀
- LoadFile: 全路径,需要DLL后缀
- Load: dll名称,不需要后缀
- 获取某一个具体的类型:参数需要是类的全名称;
- 创建对象
- 类型转换
- 调用方法
Assembly assembly =Assembly.LoadFrom("Business.DB.SqlServer.dll");
//Assembly assembly1=Assembly.LoadFile(@"E:\\VS项目\\2022年vs项目\\ReLearn\\ReLearn\\bin\\Debug\\net7.0\\Business.DB.SqlServer.dll");
//Assembly assembly2=Assembly.Load("Business.DB.SqlServer");
Type type= assembly.GetType("Business.DB.SqlServer.SqlServerHelper");
object? oInstance= Activator.CreateInstance(type);
//oInstance.Query(); //报错。因为oInstance当做是一个object类型,object类型是没有Query方法的;
//C#语言是一个强类型语言:编译时你是什么类型,以左边为准;不能调用是因为编译器不允许;实际类型一定是SqlServerHelper类型;
//如果使用dynamic 作为类型的声明,在调用的时候,没有限制;
//dynamic:动态类型;不是编译时决定类型,避开编译器的检查;运行时决定是什么类型
//dynamic oInstance1= Activator.CreateInstance(type);
//oInstance1.Query();
//oInstance1.Get(); //报错了,因为SqlServerHelper没有Get方法。
SqlServerHelper sqlServerHelper = oInstance as SqlServerHelper;
sqlServerHelper.Query();
条件反射和非条件反射的各10个例子都有哪些?
经典条件反射 (又称巴甫洛夫条件反射),是指一个刺激和另一个带有奖赏或惩罚的无条件刺激多次联结,可使个体学会在单独呈现该一刺激时,也能引发类似无条件反应的条件反应。
条件反射的例子:谈梅生津、谈虎色变、画饼充饥、睡觉认床、摇尾乞怜等。
无条件反射亦称非条件反射,是外界刺激与有机体反应之间与生俱来的固定神经联系。或在出生后发挥作用,或随着有机体的生长发育而出现。
非条件反射例子:
小孩子一打针就哭、 吃杨梅时分泌唾液、 膝跳反射、 缩手反射、 眨眼反射、 婴儿的吮吸反射等。
参考技术A 条件反射:1.训练过的狗能对铃声做出分泌唾液的反应2.望梅止渴
3.画饼充饥·
4.看到酸梅就分泌唾液
5。谈虎色变
6,。一朝被蛇咬,十年怕草绳
7.鹦鹉学舌
8.闻鸡起舞
9。看见红灯停步
非条件反射:
1.膝跳反应
2.针刺指尖引起的缩手
3.当别人朝你挥舞拳头时会眨眼
4,遇到强光后马上闭眼
5婴儿吮吸乳头
6.吃酸梅分泌唾液
7.手碰到火后立即回缩8
8.听到雷声吓一大跳
9.排尿反射
10.飞蛾扑火 参考技术B 非条件反射是指不依赖于特定刺激情境而作出的反应,是在个体发生后,生来就有的先天性反射。非条件反射一般在出生后最初几个月内形成,是在个体与环境互动的过程中逐渐建立起来的。例如吮吸反射、抓握反射、行走反射、游泳反射等。条件反射是指由生理或环境因素而形成的反射,是后天获得的,是在非条件反射的基础上建立起来的,是在个体与环境的交互作用中形成的。
以上是关于反射的主要内容,如果未能解决你的问题,请参考以下文章