首先熟悉一下原先接口的使用,顺便复习一下接口。
1 | Console.WriteLine("欢迎来到.net高级班vip课程,今天是梁老师的反射的课程"); |
//01老的调用方式
IDBHelper iDBHelper = new MySqlHelper();
iDBHelper.Query();
1 | public interface IDBHelper |
1 | public class MySqlHelper : IDBHelper |
1 | public SqlServerHelper() |
反射入门了解尝试
1 | Console.WriteLine("************************Reflection反射的入门学习*****************"); |
利用工厂模式创建对象,作为就是封装,让代码看起来简洁。
**
**
**
**
**
**
**
**
**
**
一、利用反射创建对象
IOC使用**
**
1 | <?xml version="1.0" encoding="utf-8" ?> |
1 | public class Factory |
反射的意义作用:
1. 更改配置文件,程序就会做出相应的修改。
2. 不需要编译/需要重启生效,此方法叫做程序的可配置。
3. 将dll导入后就可以生效,不需要更改代码。只需要更改配置文件即可。 (dll需要提前写好)此方法叫做程序的可配置可扩展。
4. 不需要再添加引用,直接通过文件目录寻找加载dll,然后仅仅需要更改配置文件的字符串名称,程序即刻更改,不需要更改程序代码。
5. 配置文件的使用,经常使用到反射。 反射,将dll拷贝进去,反射是动态的,依赖的是字符串! (类似于热更新???)
6. 接口的应用?IOC的应用??
1 | Console.WriteLine("************************Reflection+Factory+Config*****************"); |
**
**
**
**
**
破坏单例/创建泛型(选修)**
Activator.CreateInstance的拓展使用:
** 单例模式:**
** 概 念: **单例是一个只允许创建自身的单个实例的类。
** 意 图: **保证一个类仅有一个实例,并提供一个访问它的全局访问点。
** 主要解决: **一个全局使用的类,频繁地创建与销毁。
** 何时使用:**当想控制实例数目,节省系统资源的时候。
** 使用场景:**
** ** 1.要求生产唯一序列号。
2.WEB中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来;
3.创建的一个对象需要消耗的资源过多,比如I/O与数据库的连接等;
4.全局配置文件访问类,单例子来保证唯一性;
5.日志记录帮助类,全局一个实例一般就够了;
6.桌面应用常常要求只能打开一个程序实例或一个窗口。
** 单例的要求是他们是懒惰的创建——即直到第一次需要时才创建实例。 **
** 单例只有一个实例。**
单例写法一:
1 | public sealed class Singleton // 静态的在程序内存中只有一个 |
单例写法二:
1 | public sealed class Singleton |
单例写法三:
1 | public class Singleton |
**
**
**
**
**
破坏单例**
1 | Console.WriteLine("************************Reflection+Instance(反射+单例)*****************"); |
多构造函数的情况
1 | public class ReflectionTest |
1 | { |
泛型的情况
1 | namespace Ruanmou.DB.SqlServer |
1 | { |
Typeof(MySqlHelper)与iDBHelper.GetType()的区别:
一个针对类型,一个针对变量使用。
以上为API的使用技巧(API Show)。
**
**
二、利用反射调用方法:
** MVC使用**
1 | //oReflectionTest.Show1(); |
泛型调用私有方法
1 | { //反射也可以把私有方法也能调用 |
三、反射调用属性、字段
** ORM使用 (实体)**
没有使用反射:
1 | People people = new People(); |
使用反射的方式:
1 | //通过反射操作属性 |
原先的硬编码的方式:
1 | People people = new People(); |
利用反射的形式:
1 | Type typePeople = typeof(People); |
作业:
反射的重要应用:数据库查询的应用。
** 总结:**
反射的优缺点:
**
**
** 1.反射的优点:
**
动态: IOC : 动态加载dll,动态获取类型,动态获取对象。
MVC: 类型的实例化,方法的调用,给动态了。
ORM: ORM设置值给动态了。
面向对象开发,最大的特点是静态语言,追求稳定。程序稳定!
但是程序可扩展的话,面向抽象,接口!随意替换,可配置可扩展!通过动态的形式拼接出来,形成系统/框架。
反射对于框架来说,至关重要!
** 2.反射的缺点:**
01. 反射写起来较为复杂。
02. 避开编译器的检查。编译器不会报错了,找错不容易!
03. 性能问题。反射性能不好!性能损失很大!500倍左右!但是实际操作起来,影响不大。
性能优化:空间换时间! 差别7倍左右! 将加载dll,放在外面。 第一次加载的时候放入缓存。
MVC:第一次访问很慢,后面很快! 第一次:各种映射信息读取一边。
EF: 第一次使用很慢,后面很快!
IOC:
ORM等框架的使用!
讲一个可用的东西写成通用的东西!
额外总结:
API的自学能力很重要!
Map的使用!
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/cSharpNote/CSharp高级进阶教程_02_反射/
- 版权声明: 梁俊可工作室