C#2.0学习--反射与程序集

C#系列:探索反射的奥秘 摘要:C#反射机制通过Type、Assembly等类实现运行时动态操作类型和对象,支持动态加载程序集、创建实例、调用方法及访问成员。核心应用包括插件系统、序列化、依赖注入和动态代理,具有高度灵活性但存在性能开销。优化建议包括缓存反射对象、限制非公开访问及结合特性标注。反射在需要动态扩展的场景中不可替代,合理使用可显著提升代码灵活性。(149字) 阅读详情

反射的定义:

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

1.1 .NET可执行应用程序结构 
        程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构。
        应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。
        程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途。
(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。
(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。
(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。

(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
        System.Reflection.Emit命名空间的类提供了一种特殊形式的反射,可以在运行时构造类型。
        反射也可用于创建称为类型浏览器的应用程序,使用户能够选择类型,然后查看有关选定类型的信息。
        此外,Jscript等语言编译器使用反射来构造符号表。System.Runtime.Serialization命名空间中的类使用反射来访问数据并确定要永久保存的字段,System.Runtime.Remoting命名空间中的类通过序列化来间接地使用反射。

1.2 反射技术示例 
        下面是反射技术的示例,我们可以在程序去得时动态实例化对象,获得对象的属性,并调用对象的方法。

using System;
using System.Collections.Generic;
using System.Text;

namespace ReflectionDemo
{
    
public class HelloWorld
    
{

        
private string strName = null;

        
public HelloWorld(string name)
        
{

            strName 
= name;
        }


        
public HelloWorld()
        
{

        }


        
public string Name
        
{
            
get
            
{
                
return strName;
            }

        }

        
public void SayHello()
        
{
            
if (strName == null)
            
{
                System.Console.WriteLine(
"Hello World");
            }

            
else
            
{
                System.Console.WriteLine(
"Hello World,"+strName); 
            }

        }

    }

}


using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace ReflectionDemo
{

        
class Program
        
{

            
static void Main(string[] args)
            
{

                System.Console.WriteLine(
"列出程序集中的所有类型"); 

                Assembly a 
= Assembly.LoadFrom ("ReflectionDemo.exe"); 

                Type[] mytypes 
= a.GetTypes( );  

                
foreach (Type t in mytypes) 
                
{ 

                  System.Console.WriteLine ( t.Name ); 
                }
 

                System.Console.ReadLine ( );  

                System.Console.WriteLine (
"列出HellWord中的所有方法" ); 

                Type ht 
= typeof(HelloWorld); 

                MethodInfo[] mif 
= ht.GetMethods(); 

                
foreach(MethodInfo mf in mif) 
                
{ 

                  System.Console.WriteLine(mf.Name); 
                }
 

                System.Console.ReadLine();  

                System.Console.WriteLine(
"实例化HelloWorld,并调用SayHello方法"); 

                Object obj 
= Activator.CreateInstance(ht); //调用无参数构造函数 

                
string[] s = {"zhenlei"};

                Object objName 
= Activator.CreateInstance(ht, s); //调用参数构造函数 

                
//BindingFlags flags = (BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly); 
                MethodInfo msayhello = ht.GetMethod("SayHello"); 

                msayhello.Invoke(obj,
null); 

                msayhello.Invoke(objName,
null); 

                System.Console.ReadLine(); 

                }

            }

    }


 1.3 在设计模式实现中使用反射技术 
        采用反射技术可以简化工厂的实现。
(1)工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。
(2)抽象工厂:使用反射可以减少抽象工厂的子类。
        采用反射技术可以简化工厂代码的复杂程度,在.NET项目中,采用反射技术的工厂已经基本代替了工厂方法。
        采用反射技术可以极大地简化对象的生成,对以下设计模式的实现也有很大影响。
(1)命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。
(2)享元模式:采用反射技术实例化享元可以简化享元工厂。 

详解C#反射(Reflection) 详解C#反射的概念和用法 阅读详情

相关推荐

Day470&471.Netty概述&Netty高性能架构设计 -netty

Netty概述 一、原生 NIO 存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 JDK NIO

阿昌爱Java 1572

C#反射程序集

     由于最近用到了反射程序集这一方面的知识,我就来给大家说一下我用到的知识。反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型,类型又包含成员)1.使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。2.使用 Module 了解如下的类似...

qq_41614248的博客 921

如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统

win11 安装双系统

qq_42817360的博客 5139

【C#反射程序集】

一.在.NET中,程序集是进行部署,版本控制的基本单元。System.Reflection命名空间中的Assembly类型,代表了一个程序集。并包含了关于程序集的信息。 二.获取程序集的信息: 创建一个控制台项目,添加一个类库项目,命名为Model,里面有一个User类。 static void Main(string[] args) { //1

HilaryHe 2848

Android图形系统(三)系统篇:渲染/合成的底层原理浅析

众所周知,渲染工作是由GPU负责,那么在聊GPU之前首先得知道什么是“渲染”?我们来举个例子感受一下在系统中申请一块10*101、把图层背景这玩意染成绿的2、从左上(0,0)到右下(10,10)画一条宽度为1颜色为红色的直线3、以坐标点(5,5)为中心,画一个半径为3的实心圆,颜色要蓝色好了,接下来操作系统会把这些“绘图指令”同步给GPU去执行渲染任务图片来源:自己画的GPU完成渲染工作后,我们将会得到一个大小为10*10二维数组,数组中的每个元素都保存着坐标点的颜色信息、深度信息。

1358

vivado 工程修改芯片型号

vivado工程芯片与实际板子不匹配时,需要修改工程的芯片型号,并对原工程的ip进行同步更新,之后生成新的bit文件,烧录到板子中

k7126685的博客 1万+

C#高级--反射详解

C#高级–反射详解 一、什么是反射/反编译 1、C#编译运行过程 高级语言->编译->dll/exe文件->CLR/JIT->机器码 2、原理解析 metadata:元数据数据清单,记录了dll中包含了哪些东西,是一个描述。 IL:中间语言,编译把高级语言编译后得到的C#中最真实的语言状态,面向对象语言。 反射:来自于System.Reflection,是一个帮助类库,可以读取dll/exe中metadata,使用metadata创建对象。 Emit:一种反射技术,可以动态创建dl

李宥的博客 3万+

MobileViT替换YOLOv11主干网络:轻量化新思路-(用MobileViT等轻量视觉Transformer降低计算成本)

在计算机视觉领域,目标检测一直是核心任务之一,而YOLO(You Only Look Once)系列算法因其出色的速度-精度平衡成为工业界和学术界的热门选择。随着YOLOv11的推出,模型性能达到了新的高度,但其计算复杂度和参数量也随之增加,这对资源受限的移动设备和嵌入式系统提出了挑战。与此同时,视觉Transformer(ViT)的出现为计算机视觉带来了全新范式,但其庞大的计算需求限制了在移动端的应用。MobileViT作为一种创新的轻量级视觉Transformer架构,巧妙结合了CNN的归纳偏置优势和V

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1647

C#中的反射

一:什么是反射 通俗来讲,反射就是我们在只知道一个对象的外部而不了解内部结构的情况下,通过反射可以使我们明确这个对象的内部实现 反射是.Net中获取运行时类型信息的一种方式,.Net应用程序由几个部分组成:程序集(Assembly)、模块(Module)、类型(Class)。而反射提供一种编程的方式,可以在程序运行期获得这几个组成部分的相关信息 二:反射的作用 利用反射可以在不需要使用new关键词的情况下,就可以动态创建对象,使用对象 三:反射是如何实现的 反射的内部实现依赖于元数据 元数据简单来

L的博客 1万+

小孙学变频学习笔记(二)变频器的逆变电路

本文主要介绍了变频器中逆变电路的核心器件IGBT及其应用。IGBT是一种电压控制型三端半导体开关器件,具有开关频率高、功耗低的优点,在变频器中仅使用截止和饱和导通状态。文章详细分析了IGBT的结构特性、与晶闸管的区别,以及由四个IGBT组成的直流转交流逆变电路原理。重点阐述了IGBT并联反向二极管的作用:提供电流反向通路、避免反向电压损坏器件、提高开关效率等。最后提供了相关学习参考网址供读者进一步研究。

qq_43091070的博客 1196

vue3:最新实现腾讯人脸核身+增强版人脸核身使用方法及示例源码,Vue3如何使用腾讯云慧眼人脸核身,提供人脸核身案例、身份信息核验、活体检测与核身比对等示例代码(后端spring与thinkphp)

vue3接入腾讯人脸核身,腾讯云人脸核身Vue3+后端代码,H5人脸核身,vue3 H5如何使用腾讯人脸核身sdk,vue3+thinkphp腾讯人脸核身,Spring Boot接入腾讯云人脸核身教程,hinkphp腾讯人脸核身,vue3人脸核身插件接入流程,vue+spring boot实现腾讯人脸核身,vue3接入腾讯云【增强版人脸核身接入】,vue3 h5微信公众号网页腾讯云慧眼人脸核身,tvue3接入人脸核身SDK,vue3+typescrip+vite接入慧眼实名认证,vue3腾讯云活体人脸核身(

✅ 精选推荐文章 4119

C#2.0学习8--反射与程序集

 反射的定义:反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。 1.1 .NET可执行应用程序结构  

gongchl2006的专栏 3420

24. SAP 标准产品里使用 OData 服务的一些细节分享

笔者在编写使用事物码 SEGW 开发 SAP OData 服务的系列步骤时,但凡遇到技术上一些疑难问题,喜欢去参照 SAP 标准产品里是如何使用 OData 服务的,不少问题都可以去参考 SAP 标准产品的 OData 服务实现细节来解决。 因此本文记录笔者在编写本教程的过程中,曾经研究过的 SAP OData 服务实现的一些细节,把这些细节分享给大家,希望能起到参考作用。 同时,教程也不断收到一些朋友在评论区留言,对于不少留言的回复,我也是拿 SAP 标准 OData 服务的实现作为论据来回复的。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2031

C#编程之程序集和反射

这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了。应该把学到的东西变成自己的东西,而不是依样画瓢。 在说反射之前,我们先来了解一下什么是程序集? 程序集 程序集是.net中的概念,程序集可以看作是给一堆相关类打一个包,相当于java中的ja...

dican0465的博客 178

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C#反射学习笔记

AppDomain(应用程序域):一个进程中可以有很多个应用程序域,创建的一个控制台项目是一个进程,运行的代码是在进程默认的应用程序域中在执行,一个应用程序域中可以有多个程序集。:参数是程序集的强名称或者简单名称,只能在程序的输出目录中检索,通常是bin文件夹。加载目标程序集时会加载依赖的程序集。通过具体的路径加载程序集,不会加载依赖程序集。通过具体的路径加载程序集,会加载依赖程序集。元数据:包含程序集信息(引用的其他程序集等)、模块信息、这个是下面反射获取的类的具体信息。

Mo_Chang的博客 1089

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

unity android 反射,Unity热更新之C#反射加载程序集

用C#反射加载程序集的方式可以动态的从assetBundle资源包或其他资源包里加载脚本到工程中,即便是原工程中不存在的脚本。我这里就用加载本地assetBundle的方式来进行讲解了,加载网络上的与之类似。第一步,加载assetBundle资源,assetBundle名称为Test://将本地文件转为字节FileStream fs = new FileStream(Application.dat...

weixin_42114046的博客 704

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# 程序集和版本控制介绍

C# 程序集作为.NET 应用程序的核心构建块,负责代码的组织、部署和版本控制。通过合理地使用程序集和版本控制机制,开发者可以实现代码的模块化、重用和安全性,构建出更加健壮、可维护的应用程序。无论是开发小型的桌面应用程序,还是大型的企业级分布式系统,理解和掌握 C# 程序集和版本控制的知识,都是非常必要的。希望通过本文的介绍,能帮助你对 C# 程序集和版本控制有更深入的理解和认识。

zsnandzmn的博客 1555

C# 反射(Reflection)超详细解析

C# 反射(Reflection)超详细解析

明明明的博客 2万+

学习C#反射(Reflection)

反射提供描述程序集、模块和类型的对象(Type 类型)。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。如果代码中使用了特性(Attribute),可以利用反射来访问它们。本文主要介绍C# 反射(Reflection)。

风清扬的专栏 2231

C#程序集Assembly学习随笔(第一版)_AX

C#程序集Assembly学习随笔(第一版)_AX ①什么是程序集? 可以把程序集简单理解为你的.NET项目在编译后生成的*.exe或*.dll文件. 嗯,这个确实简单了些,但我是这么理解的.详细: http://blog.csdn.net/sws8327/archive/2006/09/21/1244642.aspx ②程序集和命名空间的区别? 一个程序集可以跨越n个命名空间

msbls5的专栏 4444

C#反射加载程序集并使用

要动态加载的dll跟输出目录中的dll冲突了,尤其是调用loadfrom的时候,其所依赖的dll一般会从输出目录中获取,但是输出目录中的dll并不是你想要的依赖版本,这时候就会冲突。当前,在一个AppDomain中只能加载dll,不能卸载,因此在一个AppDomain中不能有同名的dll程序集。加载程序集的时候会连带性的加载,会连带把该文件所依赖的dll也加载。仅加载一个文件,不会连带把该文件所依赖的dll也加载。一个线程属于一个AppDoMain。

qq_42987967的博客 975

程序集和反射(C#)

这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了。应该把学到的东西变成自己的东西,而不是依样画瓢。 在说反射之前,我们先来了解一下什么是程序集? 程序集 程序集是.net中的概念,程序集可以看作是给一堆相关类打一个包,相当于java中的jar包。 程序集包含: 资源文件...

邹玉杰(邹琼俊)的专栏 79

C#反射机制介绍

这篇文章介绍了C#的反射机制,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 先看下面一个动物点名系统的简单例子:有一个Animal的抽象动物父类,里面定义了Name、Age两个属性和一个Shout()方法,Animal类定义如下: 分别定义Cat、Dog类继承自Animal类,Cat类定义如下: Dog类定义如下: 应用场景:在一个控制台程序中,输入具体的动物的类型,根据输入的动物类型,输出Name、Age和Shout()方法,使用传统方式实现的代码如下:

仰望星空的博客 1781

【学习笔记】C# System.Type类(反射)

反射机制 反射用到的主要类: System.Type 类–通过这个类可以访问任何给定数据类型的信息。 System.Reflection.Assembly类–它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。 System.Type类:System.Type 类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。 新建一个NewClass类来测试反射 class NewClass

qq_38310237的博客 2947

C#反射

C#反射 反射初步认识 作为一名C#小白,在学习C#的过程中,遇到了不太懂的内容,专门整理了一下在网上搜集到的资料。 反射的定义 反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以使用反射对他们进行访问。 元数据的动态查询; 绑定与执行; 动态代码生成; 使...

Krisiiy 539

C# 反射详解及其反射类代码

🌍个人简介 🍁作者简介:大家好,我是HappyGirl快乐女孩,爱好各种技术🏅 ✒️个人主页:HappyGirl快乐女孩 🕺支持我:点赞👍+收藏⭐️+留言📝 💊格言:坚持学习,你一定与众不同!🔥目录目录反射1234注意:补充:原理“反射”其实就是利用程序集的元数据信息。反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): 2 若要反射当前项目...

我是慎独玩家,无人见处,自有尺度! 1348
上一篇: C/S结构和B/S结构
下一篇: MasterPage模版页
LEOlws
博客等级 码龄21年 9粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值