反射基础

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核8GB
简介: 反射基础

反射概念反射是由框架提供的一个类库,可以访问dll的metadata,获取的dll的信息,并使用它

反射的命名空间:using System.Reflection;

DLL里面包含了两种:

1.IL中间语言,最后变成机器码

2.metadata元数据,用于描述IL

程序结构:

Reflence引用DB.sqlserver DB.interface

DB.sqlserver引用DB.interface

cdef9656ce552e599817e52ef625f2f6_779.png

接口配置:

70d59673e657ccbeec3e7ae18428ddc5_794.png

a2ceaa5b7b658eb12ff4feaa897e15f5_800.png

普通实现方法:实例化

IDBserver dBserver =newsqlserverDBhelper();
dBserver.Query();

效果

c2313dc9fde036f927fa232824be3cd6_815.png

利用反射去实现:

//Assembly是反射的命名空间引入的类
Assembly assembly = Assembly.Load("DB.sqlserver");//动态加载dll没有后缀
Type type = assembly.GetType("DB.sqlserver.sqlserverDBhelper");//获取类型名称 传递完整类型
Object obj = Activator.CreateInstance(type);//创建对象
((sqlserverDBhelper)obj).Query();//调用方法
Console.ReadLine();


如果每增加一个类就要重新指定DLL名称,配置性不高

为了增加程序的可配置性,新建一个工厂类

如果程序需要读取配置文件就需要引入一个DLL

72a5d620641271ccfdbba467c6e7581a_893.png

引入命名空间 using System.Configuration;
配置文件添加,键值对

<appSettings>
<add key="IDBHelperType" value="DB.sqlserver,DB.sqlserver.sqlserverDBhelper"></add>
</appSettings>
publicclassObjectFactroy
{
//根据key名字获取,读取到当前项
privatestatic string IDBHelperType = ConfigurationManager.AppSettings["IDBHelperType"];
publicstatic string DLLName = IDBHelperType.Split(',')[0];//获取DLL名称
publicstatic string TypeName = IDBHelperType.Split(',')[1];//获取文件名
publicstatic IDBserver CreateInstance()
{
            Assembly assembly = Assembly.Load(DLLName);
            Type type = assembly.GetType(TypeName);//获取类型名称 传递完整类型
            Object obj = Activator.CreateInstance(type);//创建对象
return(IDBserver)obj;
}
}


有需要变更直接在配置文件更改value值

Main 函数调用

IDBserver bserver = ObjectFactroy.CreateInstance();
bserver.Query();

1.怎样让程序可配置可扩展呢,在不改变原来代码的条件下增加一个类库

7ba79e95f9156f677005049ed40d6665_911.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DB.Interface;
namespace DB.Oracle
{
publicclassOracleDBhelper: IDBserver
{
publicOracleDBhelper()
{
            Console.WriteLine("{0}被构造",this.GetType().Name);
}
publicvoidQuery()
{
            Console.WriteLine("{0},Query",this.GetType().Name);
}
}
}

修改配置文件指向新的DLL

9083a1b729ab699e0c01d22d80080432_919.png

 

上述已经配置好接口类型,第三方依赖注入的容器会帮你完成创建

实际上这就是IOC,业务逻辑层提供一个接口进行IOC的配置

b07de7c902d83da6c9305bcd9f3ec4f2_923.png

此时

1.去掉接口,反射调用方法

此时调用的是Query的无参数构造方法

Assembly assembly = Assembly.Load("DB.sqlserver");//动态加载dll没有后缀
Type type = assembly.GetType("DB.sqlserver.sqlserverDBhelper");//获取类型名称 传递完整类型
Object obj = Activator.CreateInstance(type);//创建对象
MethodInfo method = type.GetMethod("Query",newType[]{});
method.Invoke(obj,newobject[]{});

仔细观察发现这也是MVC方法响应的原理,DLL在程序最初已经编译好,MVC路径:/控制器/方法。只需要指定方法就能随意跳转页面

模仿控制器传入方法的多种参数

Assembly assembly = Assembly.Load("DB.sqlserver");//动态加载dll没有后缀
            Type type = assembly.GetType("DB.sqlserver.sqlserverDBhelper");//获取类型名称 传递完整类型
            Object obj = Activator.CreateInstance(type);//创建对象
{
{
                    MethodInfo method = type.GetMethod("Query",newType[]{});
                    method.Invoke(obj,newobject[]{});
}
{
                    MethodInfo method = type.GetMethod("Query",newType[]{typeof(string)});
                    method.Invoke(obj,newobject[]{"AB"});
}
{
                    MethodInfo method = type.GetMethod("Query",newType[]{typeof(int)});
                    method.Invoke(obj,newobject[]{20});
}
{
                    MethodInfo method = type.GetMethod("Query",newType[]{typeof(string),typeof(int)});
                    method.Invoke(obj,newobject[]{"AB",20});
}
{
                    MethodInfo method = type.GetMethod("Query",newType[]{typeof(int),typeof(string)});
                    method.Invoke(obj,newobject[]{20,"AB"});
}
}

反射最大的优点:动态加载、不需要引用命名空间

缺点:编写麻烦,避开了编译器的检查不到错误

利用反射获取属性和方法

写死的方法:


People people =newPeople()
{
     id=10,
     Name="YLC"
};
people.Property ="字段";
Console.WriteLine("id:{0}",people.id);
Console.WriteLine("Name:{0}", people.Name);
Console.WriteLine("Property:{0}", people.Property);

affaf89a7159d4999a9fd271b0786e45_1194.png


 

 

这个时候如果增加一个属性,代码又需要修改,增加100个就要打印100 Console.WriteLine();

利用反射自带的进行实现

Type type =typeof(People);
foreach(var item in type.GetProperties())//获取属性
{
                object obj = item.GetValue(people);
                Console.WriteLine("{0}:{1}",item.Name,obj);
}
foreach(var item in type.GetFields())//获取字段
{
                object obj = item.GetValue(people);
                Console.WriteLine("{0}:{1}", item.Name, obj);
}


效果相同

相关文章
|
机器学习/深度学习 数据可视化 算法
深度学习之梯度下降参数可视化
深度学习之梯度下降参数可视化
|
10月前
|
存储 算法 安全
.NET 平台 SM2 国密算法 License 证书生成深度解析
授权证书文件的后缀通常取决于其编码格式和具体用途。本文档通过一个示例程序展示了如何在 .NET 平台上使用国密 SM2 算法生成和验证许可证(License)文件。该示例不仅详细演示了 SM2 国密算法的实际应用场景,还提供了关于如何高效处理大规模许可证文件生成任务的技术参考。通过对不同并发策略的性能测试,开发者可以更好地理解如何优化许可证生成流程,以满足高并发和大数据量的需求。 希望这段描述更清晰地传达了程序的功能和技术亮点。
1171 14
.NET 平台 SM2 国密算法 License 证书生成深度解析
|
7月前
|
存储 安全 Android开发
HarmonyOS实战:一招搞定保存图片到相册
本文介绍了在鸿蒙系统中实现保存图片到相册的功能,包括申请权限和使用系统安全控件两种方式。文中详细讲解了如何通过网络请求下载图片并保存为本地文件,以及如何将指定布局生成图片并保存。鸿蒙系统对权限管理较为严格,推荐使用系统提供的安全控件(如 SaveButton)以保护用户隐私,避免手动申请权限。此外,文章还对比了鸿蒙与 Android/iOS 的实现差异,指出鸿蒙在功能实现上更简单,但需注意权限规范以确保项目顺利上线。
996 0
HarmonyOS实战:一招搞定保存图片到相册
|
11月前
|
人工智能 搜索推荐
AI视频技术的发展是否会影响原创内容的价值
AI视频技术的发展显著降低了视频制作的门槛与成本,自动完成剪辑、特效添加等繁琐工作,大大缩短创作时间。它提供个性化创意建议,帮助创作者突破传统思维,拓展创意边界。此外,AI技术使更多非专业人士也能参与视频创作,注入新活力与多样性,丰富了原创内容。总体而言,AI视频技术不仅提升了创作效率,还促进了视频内容的创新与多样化。
|
网络协议 数据处理 C语言
网络编程进阶:UDP通信
网络编程进阶:UDP通信
|
传感器 存储 物联网
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点,广泛应用于嵌入式系统开发、通信协议实现及后端服务构建等领域,成为推动物联网技术进步的重要力量。
467 1
|
SQL 存储 关系型数据库
新手如何入门学习PostgreSQL?
新手如何入门学习PostgreSQL?
248 1
|
机器学习/深度学习 人工智能 物联网
hummingbird,一个便于将模型部署到边缘设备的Python库!
hummingbird,一个便于将模型部署到边缘设备的Python库!
328 1
|
JSON Go 数据格式
Go实现json字符串与各类struct相互转换
文章通过Go语言示例代码详细演示了如何实现JSON字符串与各类struct之间的相互转换,包括结构体对象生成JSON字符串和JSON字符串映射到struct对象的过程。
284 0
|
机器学习/深度学习 搜索推荐 算法
利用机器学习算法增强IAA广告定位和预测:实现个性化广告投放以最大化收益
【7月更文第30天】在当今高度竞争的移动应用市场中,应用内广告(IAA)是许多开发者获取收入的重要途径之一。然而,传统的广告推送方式往往忽略了用户的个体差异性,导致广告效果不佳。通过运用机器学习技术,我们可以更准确地理解用户偏好,从而实现个性化的广告推送。
817 0

热门文章

最新文章