反射的应用
1 动态的创建程序集
2 动态加载调用程序集
反射,一般用法就是用一动态加载程序集,我在开发插件的时候用过,因为插件就是即持即用,所以要动态加载,插件的开发,实际上就是反射和接口的使用。
面向的层面越基础,越需要反射;反射体现了动态程序结构和系统扩展;用反射机制实现的程序可以理解为脚本化/解释执行的编译程序
net反射机制为创建对象和调用方法提供了替代方案,我们平时都是实例化类,创建
对象调用方法即可。这个机制给我们提供了另外一种选择。
优点:是提高了应用程序的灵活行。
缺点:是增加代码量,写起来比较麻烦。
晚期绑定是指在运行时调用对象方法而在编译时并不知道它们。晚期绑定在计算领域中并不是新鲜的事物,以往有很多语言将晚期绑定作为访问函数和对象的唯一方法提供。各种语言和开发环境提供了不同的晚期绑定方法,但所有方法的公共机制在本质上是相似的:使对象调用成为包含调用说明的原始数据,在运行时由解释器对这些原始数据进行分析并转换为实际调用
反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。
反射是一种机制,通过这种机制我们可以知道一个未知类型的类型信息.比如,有一个对象a,这个对象不是我们定义的,也许是通过网络捕捉到的,也许是使用泛型定义的,但我们想知道这个对象的类型信息,想知道这个对象有哪些方法或者属性什么的.甚至我们想进一步调用这个对象的方法.关键是现在我们只知道它是一个对象,不知道它的类型,自然不会知道它有哪些方法等信息.这时我们该怎么办?反射机制就是解决这么一个问题的.通过反射机制我们可以知道未知类型对象的类型信息.
反射指的是一个编程技巧,在当前应用领域的运行时间内,开发者可以利用它授权一个程序集检查并修改自身或其他程序集。那些检查能够让开发者执行比用其他方法实现的更为强大的后期捆绑功能
.NET Framework中生成的每个程序集都包含了描述程序集以及程序集中的类或结构的元数据。应用这个元数据,反射能够列举一个程序集所包含的一切类、结构和数据。一旦我们了解某一程序集的功能,就可能修改并利用这些功能。
应用反射:大多数的序列化引擎应用反射从需要序列化的对象中提取数据。反射还可以用内置模块来建立可自定义的应用结构。许多对象关系建模(ORM)还利用反射来执行动态映射功能。反射的最有趣应用之一在于它能大大减少完成单调开发任务所需的时间。由于反射是完全动态的,它允许你在不必重新生成代码的情况下改变基本的结构,因而反射是一个非常优秀的代码生成替代工具。例如,许多代码生成工具允许你根据基本的数据库建立数据对象。反射可用来从DataTables——它由数据库中返回——这样的数据结构中动态提取商业对象(类)。应用这种方法,就不必应用代码生成器来生成代码。你只要简单地循环遍历DataTables中的竖栏,并将栏名称与商业对象中的属性名称动态匹配。还可用反射将一个对象的属性与一个存储程序参数动态捆绑起来。这个捆绑过程允许你建立普通的数据访问方法,提供代码生成工具为你带来的许多完全动态的优势。因此,反射能够显著减少代码长度,并缓解应用维护压力。
反射是在没有提供代码的情况下,仅仅通过DLL文件来获取该文件中所包含的接口,类,方法等,并调用它们。一般反射用来实现在不同模块甚至不同的软件之间协调工作,整合起来实现一项应用。这样做可以降低不同模块之间的依赖关系,大大提高可维护性。
反射在下列情况下很有用:
需要访问程序元数据的属性。请参见主题使用反射访问属性。
检查和实例化程序集中的类型。
在运行时构建新类型。使用 System.Reflection.Emit 中的类。
执行后期绑定,访问在运行时创建的类型的方法。请参见主题动态加载和使用类型。
反射的一般概念:反射提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。我觉得这个已经是对反射比较干脆利落的诠释。这里的”动态”二字非常重要,即指的是运行时刻,在运行的时刻我们可以根据程序逻辑或外部要求(比如配置文件等)创建类型的实例,然后实现象用new构造对象一样同等的效果。当然构造了这个实例之后下来的访问和以前就一样。
反射的效率:采用反射构造对象的实例,机器明显出现延迟,不言而喻,反射是以牺牲效率为代价的。
优点:
1.反射是一个非常优秀的代码生成替代工具,能够显著减少代码长度,并缓解应用维护压力。
2.可以降低不同模块之间的依赖关系,大大提高可维护性。
缺点:
反射是以牺牲效率为代价的即消耗性能大。
using System;
2
3namespace Webtest
4{
5 /**//// <summary>
6 /// ReflectTest 的摘要说明。
7 /// </summary>
8 public class ReflectTest
9 {
10 public ReflectTest()
11 {}
12
13 public string WriteString(string s)
14 {
15 return "欢迎您," + s;
16 }
17
18 /**//// <summary>
19 /// dsajkjflasjdfalksdjfaskfd
20 /// </summary>
21 /// <param name="s"></param>
22 /// <returns></returns>
23 public static string WriteName(string s)
24 {
25 return "欢迎您光临," + s;
26 }
27
28 public string WriteNoPara()
29 {
30 return "您使用的是无参数方法";
31 }
32 }
33}
public void test1()
2 {
3 System.Reflection.Assembly ass;
4 Type type ;
5 object obj;
6 try
7 {
8 ass = System.Reflection.Assembly.LoadFile(@"d:\TestReflect.dll");
9 type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称
10 System.Reflection.MethodInfo method = type.GetMethod("WriteString");//方法的名称
11 obj = ass.CreateInstance("Webtest.ReflectTest");//必须使用名称空间+类名称
12 string s = (string)method.Invoke(obj,new string[]{"jianglijun"}); //实例方法的调用
13
14 Response.Write(s+"<br>");
15 method = type.GetMethod("WriteName");//方法的名称
16 s = (string)method.Invoke(null,new string[]{"jianglijun"}); //静态方法的调用
17 Response.Write(s+"<br>");
18
19 method = type.GetMethod("WriteNoPara");//无参数的实例方法
20 s = (string)method.Invoke(obj,null);
21 Response.Write(s+"<br>");
22 method = null;
23 }
24 catch(Exception ex)
25 {
26 Response.Write(ex+"<br>");
27 }
28 finally
29 {
30 ass = null;
31 type = null;
32 obj = null;
33 }
34 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述