C#中的反射

dll和exe文件的区别

  1. 用途

    • .exe(可执行文件):是可以直接运行的程序文件。当你双击一个 .exe 文件或在命令行中输入它的名字,操作系统会加载并执行这个程序。

    • .dll(动态链接库):包含可以被多个程序共享的代码和资源。.dll 文件不是直接运行的程序,而是作为其他程序的依赖项,提供函数、类、资源等。

  2. 执行

    • .exe 文件包含程序的入口点,操作系统通过这个入口点执行程序。

    • .dll 文件不包含入口点,它们是被 .exe 文件或其他 .dll 文件在运行时加载和使用的。

  3. 部署

    • .exe 文件通常作为独立的应用程序分发。

    • .dll 文件可以被多个应用程序共享,但有时也需要与使用它们的应用程序一起分发。

  4. 重用性

    • .exe 文件是自包含的,通常不设计为可重用的组件。

    • .dll 文件设计为可重用的组件,可以被不同的应用程序重复使用,以避免代码重复。

  5. 更新和维护

    • 更新 .exe 文件通常意味着替换整个应用程序文件。

    • 更新 .dll 文件可以只替换库文件,而不需要重新部署整个应用程序。

  6. 依赖性

    • .exe 文件可能依赖于特定的 .dll 文件来运行。

    • .dll 文件可能依赖于其他 .dll 文件(称为依赖项)。

  7. 编译

    • .exe 文件是程序的最终编译输出,包含了所有必要的代码和资源,准备直接运行。

    • .dll 文件是库项目的编译输出,通常不包含独立的程序逻辑。

  8. 系统整合

    • .exe 文件可以作为系统进程独立运行。

    • .dll 文件可以被整合到其他 .exe 文件中,作为它们功能的一部分。

反射的作用

操作metadata(元数据)的工具

反射的功能

反射提供了以下主要功能:

  1. 类型发现:可以查询类型的属性、方法、构造函数、事件、字段等。

  2. 类型创建:可以动态地创建类型的实例。

  3. 调用成员:可以调用类型的成员,如方法和属性。

  4. 修改访问修饰符:可以无视私有(private)、受保护(protected)等访问修饰符的限制,访问或修改成员的值。

  5. 泛型类型信息:可以获取泛型类型的参数信息。

  6. 自定义属性读取:可以读取类型或成员上定义的自定义属性。

调用反射的类名

 static void Main(string[] args){Assembly assembly1 = Assembly.Load("7.13day01");//加载方式一 dll文件名Assembly assembly2 = Assembly.LoadFile("D:\\C#daima\\7.13day\\bin\\Debug\\net8.0\\7.13day.dll");//加载方式二:完整路径名Assembly assembly3 = Assembly.LoadFrom("7.13day01.dll");Assembly assembly4 = Assembly.LoadFile("D:\\C#daima\\7.13day\\bin\\Debug\\net8.0\\7.13day.dll");foreach (var type in assembly1.GetTypes()){Console.WriteLine("assembly1类名" + type.Name);foreach (var field in type.GetMethods()){Console.WriteLine("assembly1方法名称:" + field);}}
​foreach (var type in assembly2.GetTypes()){Console.WriteLine("assembly2类名" + type.Name);}foreach (var type in assembly3.GetTypes()){Console.WriteLine("assembly3类名" + type.Name);}foreach (var type in assembly4.GetTypes()){Console.WriteLine("assembly4类名" + type.Name);}}
internal class Person
{public void Methed1(){
​}public void Methed2(){
​}
}

注意Load只能加载本文件下的dll

反射创建对象

using System.Reflection;
​
namespace Mynamespase
{internal class ReflectionText{
​
​public void methed(){Console.WriteLine("方法");}static void Main(string[] args){Assembly assembly = Assembly.LoadFrom("7.13day02.dll");//加载dllType type = assembly.GetType("Mynamespase.ReflectionText");//获取类型object obj = Activator.CreateInstance(type);//创建对象ReflectionText refl = obj as ReflectionText;//类型转换as不报错,类型不对返回null refl.methed();}}
}
​

as

在C#中,as 是一个关键字,用于执行引用类型的安全类型转换。as 运算符尝试将一个对象转换为指定的类型,如果转换失败,它不会抛出异常,而是返回 null。这使得 as 运算符成为在不确定能否成功转换类型时的一种安全选择。

as运算符的关键特性:

  1. 安全转换:使用 as 运算符进行类型转换是安全的,因为如果转换不可能进行,结果将是 null,而不是抛出异常。

  2. 仅引用类型as 运算符只能用于引用类型或可空类型(nullable value types)。

  3. 隐式转换:如果编译器确定转换是有效的,即存在从源类型到目标类型的隐式转换,那么 as 运算符可以成功转换而不会返回 null

  4. 失败时返回 null:如果转换不可能进行,as 运算符将返回 null,而不是 null 引用异常。

反射创建构造函数(带参数)

using System.Reflection;
​
namespace Mynamespase
{internal class ReflectionText{int Age;public ReflectionText(){Console.WriteLine("这是无参构造");}public ReflectionText(int Age){Console.WriteLine("这是有参构造");}
​public void methed(){Console.WriteLine("方法");}static void Main(string[] args){Assembly assembly = Assembly.LoadFrom("7.13day02.dll");//加载dllType type = assembly.GetType("Mynamespase.ReflectionText");//获取类型foreach (ConstructorInfo ctor in type.GetConstructors())//获取到所有的构造方法{Console.WriteLine(ctor.Name);foreach (ParameterInfo pi in ctor.GetParameters()){Console.WriteLine(pi.ParameterType);}}Console.WriteLine("-------------------创建对象-----------------------");object obj1 = Activator.CreateInstance(type);//无参构造object obj2 = Activator.CreateInstance(type,new object[] { 123 });//无参构造}}
​
​
​
​
}
​

Activator.CreateInstance(type,true);后面加true可以创建私有的构造函数

设置类的属性

using System.Reflection;

namespace Mynamespase
{
    internal class ReflectionText
    {
        public int Age;
        public ReflectionText()
        {
            Console.WriteLine("这是无参构造");
        }
        public ReflectionText(int Age)
        {
            Console.WriteLine("这是有参构造");
        }

        public void methed()
        {
            Console.WriteLine("方法");
        }

        private static void Main(string[] args)
        {            
            ReflectionText reflectionText = new ReflectionText();
            reflectionText.Age = 12;
            Type type = typeof(ReflectionText);
            FieldInfo  fieldInfo=type.GetField("Age",BindingFlags.Public | BindingFlags.Instance);
            Console.WriteLine(fieldInfo.GetValue(reflectionText));
            fieldInfo.SetValue(reflectionText, 22);
            Console.WriteLine(fieldInfo.GetValue(reflectionText));
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

graphviz subgraph添加边界框

subgraph name 属性必须要以cluster开头。 A Quick Introduction to GraphvizAn awesome tool for software documentation and visualizing graphshttps://www.worthe-it.co.za/blog/2017-09-19-quick-introduction-to-graphviz.html digraph {rankdir"LR"// the n…

【探索Linux】P.39(传输层 —— TCP的三次 “握手” 和四次 “挥手” )

阅读导航 引言一、TCP的三次握手1. 简介2. 图解三次握手3. 名词解释(1)SYN(同步序列编号)包(2)SYN-ACK(同步确认)包(3)ACK(确认)包 4.…

基于matlab的SVR回归模型

1 原理 SVR(Support Vector Regression)回归预测原理,基于支持向量机(SVM)的回归分支,其核心思想是通过寻找一个最优的超平面来进行回归预测,并处理非线性回归问题。以下是SVR回归预测原理的系统…

浪潮天启防火墙TQ2000远程配置方法SSL-V偏、L2xx 配置方法

前言 本次设置只针对配置V偏,其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行V偏配置。 其他配置可参考:浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…

面试内容集合

用例设计方法 (一)等价类划分  常见的软件测试面试题划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理…

智慧校园毕业管理:全面解读毕业批次功能

在智慧校园的毕业管理系统中,毕业批次模块通过其精心设计的毕业批次功能,为即将离校的学子们提供了一个高效、便捷的过渡平台。这一特色功能聚焦于特定时间段内的毕业生群体,巧妙融合数字技术,从信息核实到最终的离校程序&#xf…

代码随想录二刷7.22|977.有序数组的平方

暴力解法: ——如果想暴力解决这个问题的话,可以像题目那样,先将每一个元素平方,然后再排序 双指针: ——从题目中找到的信息:这是一个非递减顺序的整数数组,从例子中,可以容易看…

西邮计科嵌入式复习

西邮嵌入式复习 一、第一章复习二、第二章复习三、第三章复习四、第四章复习 一、第一章复习 二、第二章复习 三、第三章复习 四、第四章复习

内网服务器通过squid代理访问外网

一、背景 现在要对172.16.58.158服务器进行openssh升级操作,我用之前写好的升级脚本执行后,发现没有备份旧的ssh程序文件,然后还卸载了oenssl-devel,然后我发现其他服务器ssh该服务器失败。同时脚本执行时报错“ configure: error: *** zlib.h missing - please install first …

无人驾驶大热,新能源汽车智能化中的算网支持

来源新华社:百度“萝卜快跑”全无人驾驶汽车行驶在路上 当前,新能源汽车产业数智化已成为全球汽车产业数字化转型的焦点。一方面,随着人工智能、大数据、云计算等技术的深度融合,新能源汽车在自动驾驶、智能互联、能源管理等方面…

xmind梳理测试点,根据这些测试点去写测试用例

基本流(冒烟用例必写) 备选流 公共测试点:

【题解】42. 接雨水(动态规划 预处理)

https://leetcode.cn/problems/trapping-rain-water/description/ class Solution { public:int trap(vector<int>& height) {int n height.size();// 预处理数组vector<int> lefts(n, 0);vector<int> rights(n, 0);// 预处理记录左侧最大值lefts[0] …

GuLi商城-商品服务-API-品牌管理-OSS前后联调测试上传

服务端签名直传 这种方式文件上传不用走自己的服务器了 zhouyimo.oss-cn-beijing.aliyuncs.com 后端启动: nacos: 虚拟机启动:里面mysql自动启动 前端项目启动:npm run dev 单文件上传和多文件上传地址都要改成自己的外网访问地址

Minio搭建文件服务器的学习

MinIO是一个高性能的开源对象存储服务器&#xff0c;与Amazon S3兼容。它使用Go语言编写&#xff0c;可以在多种操作系统上运行&#xff0c;如Linux、MacOS和Windows等。MinIO的分布式特性使其能够轻松扩展存储容量和处理能力&#xff0c;满足大规模数据存储的需求。 使用Docke…

展望未来:在【PyCharm】中结合【机器学习】实现高效的图形化处理

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言一、PyCharm简介与配置1.1 PyCharm基础1.2 图形化库配置 二、机器学习项目中的数据可视化2.1 数据加载与预处理2.2 数据探索性可视化2.3 模型训练与结果可视化 三、PyCharm中的图形化调试四、高级…

JAVASE 重点基础语法 - JAVA基础知识点复习(1)

目录 一&#xff0c;关键字 定义&#xff1a;被JAVA语言赋予了特殊的含义&#xff0c;来用来做专门用途的单词 关键字分类&#xff1a; 1&#xff0c;用于定义数据类型的关键字 2,用于定义流程控制的关键字 3,用于定义访问权限修饰符的关键字 4&#xff0c;用于定义类&am…

C++从入门到起飞之——缺省参数/函数重载/引用全方位剖析!

目录 1.缺省参数 2. 函数重载 3.引⽤ 3.1 引⽤的概念和定义 3.2 引⽤的特性 3.3 引⽤的使⽤ 3.4 const引⽤ 3.5 指针和引⽤的关系 4.完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ C从入门到起飞 个人格言&#xff1a;悟已往之不谏…

MySQL学习笔记 下

MySQL学习笔记&#xff08;需接上篇&#xff09; 1. 通配符 用于替换字符串中的一个或多个字符&#xff1b;通配符常与LIKE关键字一起使用&#xff0c;用于搜索字段中的指定模式&#xff1b; 2. 别名 用于为表或表中的列提供临时名称&#xff1b; 别名用于为表或表中的字段…

【安装记录】:安装破解 ideaIU-2024.1.4

1、官网下载安装包&#xff1a; https://www.jetbrains.com/idea/download/?sectionwindows 2、按照下图操作&#xff1a; 然后&#xff0c;自定义重启即可 3、破解参考这篇文章&#xff1a;https://www.exception.site/article/1727

【QT】窗口MainWindow

目录 窗口的组成 菜单栏 图形化创建菜单栏 代码创建菜单栏 给菜单设置快捷键 添加子菜单 添加分割线 添加图标 创建menuBar的细节 工具栏 设置工具栏出现的初始位置&#xff08;上下左右&#xff09; 设置工具栏允许停靠的位置 设置不允许浮动 设置不允许移动…