C#中的反射

news2024/9/25 15:22:06

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");//加载dll
            Type 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");//加载dll
            Type 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.coloradmin.cn/o/1924012.html

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

相关文章

如何在SpringCloud中使用Kafka Streams实现实时数据处理

使用Kafka Streams在Spring Cloud中实现实时数据处理可以帮助我们构建可扩展、高性能的实时数据处理应用。Kafka Streams是一个基于Kafka的流处理库,它可以用来处理流式数据,进行流式计算和转换操作。 下面将介绍如何在Spring Cloud中使用Kafka Streams实…

从零开学C++:类和对象(中)

引言:在我们学习了类和对象(上)的基础知识后,我们就需要进入类和对象(中)的学习。本篇博客将会介绍C的几个默认成员函数,它们的存在虽然难以理解,但也是C如此简单实用的原因之一。相…

C++学习指南(一)——C++入门基础

欢迎来到繁星的CSDN,本期内容主要包括C第一个程序,命名空间,缺省参数,函数重载,引用、inline以及nullptr这些基础概念。 在进入正题之前,我需要先阐述一下。本系列涉及的内容为C部分,可以理解为…

The Open Group 爱丁堡大会高光集锦——企业架构、人工智能和可持续发展的创新交叉点

4月底,The Open Group峰会在英国爱丁堡顺利举办。活动邀请到数十位领域专家、技术、论坛成员、工作组和联合组织等相聚在一起,围绕生态系统架构和人工智能标准、可持续性、企业架构、数字转型等话题进行了对话与探讨。大会吸引了来自30个国家的400位观众…

bi项目笔记

1.bi是什么 bi项目就是商业智能系统,也就是数据可视画、报表可视化系统,如下图的就是bi项目了 2.技术栈

Mysql数据库的备份与恢复以及索引操作

一,备份与恢复操作 1,创建数据库booksDB CREATE DATABASE booksDB; use booksDB; 2,建表 (1)创建表books CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NUL…

MYSQL--第八次作业

MYSQL–第八次作业 一、备份与恢复 环境搭建: CREATE DATABASE booksDB; use booksDB;CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL );CREATE TABLE authors ( auth_id INT NOT NULL PRI…

SpringCloud第三篇(服务中心与OpenFeign)

p 文章目录 一、服务中心二、Nacos注册中心 一、服务中心 在上一章我们实现了微服务拆分,并且通过Http请求实现了跨微服务的远程调用。不过这种手动发送Http请求的方式存在一些问题。 试想一下,假如商品微服务被调用较多,为了应对更高的并发…

【JavaEE】AOP实现原理

概述 Spring AOP 是基于动态代理来实现AOP的, 此处主要介绍代理模式和Spring AOP的源码剖析 一.代理模式 代理模式是一种常用的设计模式,它允许为其他对象提供代理,以控制对这个对象的访问。这种结构在不改变原始类的基础上,通过引入代理类…

前端的页面代码

根据老师教的前端页面的知识&#xff0c;加上我也是借鉴了老师上课所说的代码&#xff0c;马马虎虎的写出了页面。如下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</ti…

Gitea 仓库事件触发Jenkins远程构建

文章目录 引言I Gitea 仓库事件触发Jenkins远程构建1.1 Jenkins配置1.2 Gitea 配置引言 应用场景:项目部署 I Gitea 仓库事件触发Jenkins远程构建 Gitea支持用于仓库事件的Webhooks 1.1 Jenkins配置 高版本Jenkins需要关闭跨域限制和开启匿名用户访问 在Jenkins启动前加入…

微前端基础知识

1. 前言 随着Web应用程序规模的日益扩大和复杂性的增加&#xff0c;传统的前端开发模式逐渐显现出其在维护、扩展以及团队协作方面的局限性。微前端作为一种新兴的前端架构模式&#xff0c;正是为了应对这些挑战而诞生的。 微前端&#xff08;Micro-Frontends&#xff09;并没有…

matine组件库踩坑日记 --- react

Mantine实践 一 禁忌核心css样式二 添加轮播图扩展组件 一 禁忌核心css样式 import React from react import ReactDOM from react-dom/client import { BrowserRouter } from react-router-dom; import App from ./App.jsx import ./index.css import mantine/core/styles.cs…

收银系统源码-会员功能

随着新零售时代不断更新迭代&#xff0c;私域会员已经成为很多连锁门店必要的选择。自然离开不了一套能高效管理会员的收银系统。今天给大家推荐一下&#xff0c;智慧新零售收银系统的会员功能。 了解更多查看下文&#xff1a; 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&…

开源项目:机遇与挑战共存的创新之路

开源项目&#xff1a;机遇与挑战共存的创新之路 开源&#xff08;Open Source&#xff0c;开放源码&#xff09;被非盈利软件组织&#xff08;美国的Open Source Initiative协会&#xff09;注册为认证标记&#xff0c;并对其进行了正式的定义&#xff0c;用于描述那些源码可以…

倒计时 2 周!CommunityOverCode Asia 2024 IoT Community 专题部分

CommunityOverCode 是 Apache 软件基金会&#xff08;ASF&#xff09;的官方全球系列大会&#xff0c;其前身为 ApacheCon。自 1998 年以来&#xff0c;在 ASF 成立之前&#xff0c;ApacheCon 已经吸引了各个层次的参与者&#xff0c;在 300 多个 Apache 项目及其不同的社区中探…

线性回归(梯度下降)

首先说案例&#xff1a; 房子的价格和所占面积有着很大的关系&#xff0c;假如现在有一些关于房子面积和价格的数据&#xff0c;我要如何根据已经有的数据来判断未知的数据呢&#xff1f; 假如x(房屋面积)&#xff0c;y(房屋价格) x[ 56 72 69 88 102 86 76 79 94 74] y[92, …

struts2如何防止XSS脚本攻击(XSS防跨站脚本攻击过滤器)

只需要配置一个拦截器即可解决参数内容替换 一、配置web.xml <filter><filter-name>struts-xssFilter</filter-name><filter-class>*.*.filters.XssFilter</filter-class></filter><filter-mapping><filter-name>struts-xss…

1.5.1抽象java入门

前言&#xff1a; 1.5.0版本中&#xff0c;我们熟练使用Git三个可视化操作&#xff08;签出&#xff0c;提交&#xff0c;对比&#xff09;&#xff0c;再加上1.4.0版本的新建&#xff0c;总计使用四个Git可视化操作&#xff1b;对java编程的学习&#xff0c;总结&#xff0c;…

vector 介绍

1.简述vector 首先我们要大致弄明白vector是一个什么东西,其实vector就是之前我们学过的顺序表,这里直接使用就行了. 定义vector-------->vector<typename> arr 此时的这种定义vector可以理解成为一个数组,而typename可以是各种数据类型,比如string,int,double....…