C#中反射的使用总结

反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。可以直接通过反射方式创建对象,即使这个对象的类型在编译时没有加载。本文主要介绍.NET(C#)中反射使用总结,及相关操作的示例代码。

1、反射的用途

1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 
   

2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 
  

3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。 
 

4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。
  

5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
   

6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。 
   

7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。

8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

2、反射相关的类和命名空间

1)命名空间

System.Reflection	
System.Type
System.Reflection.Assembly

2)System.Type 类

通过这个类可以访问任何给定数据类型的信息。 System.Type 类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。


3)Type类的属性

属性

描述

Name

数据类型名

FullName

数据类型的完全限定名(包括命名空间名)

Namespace

定义数据类型的命名空间名

IsAbstract

指示该类型是否是抽象类型

IsArray

指示该类型是否是数组

IsClass

指示该类型是否是类

IsEnum

指示该类型是否是枚举

IsInterface

指示该类型是否是接口

IsPublic

指示该类型是否是公有的

IsSealed

指示该类型是否是密封类

IsValueType

指示该类型是否是值类型

4)Type类的方法

方法

描述

GetConstructor(),

GetConstructors()

返回ConstructorInfo类型,

用于取得该类的构造函数的信息

GetEvent(), 

GetEvents()

返回EventInfo类型,

用于取得该类的事件的信息

GetField(), 

GetFields()

返回FieldInfo类型,

用于取得该类的字段(成员变量)的信息

GetInterface(),

GetInterfaces()

返回InterfaceInfo类型,

用于取得该类实现的接口的信息

GetMember(), 

GetMembers()

返回MemberInfo类型,

用于取得该类的所有成员的信息

GetMethod(), 

GetMethods()

返回MethodInfo类型,

用于取得该类的方法的信息

GetProperty(), 

GetProperties()

返回PropertyInfo类型,

用于取得该类的属性的信息

可以调用这些成员,其方式是调用TypeInvokeMember()方法,或者调用MethodInfo, PropertyInfo和其他类的Invoke()方法。 

5)System.Reflection.Assembly类

它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。Assembly类可以获得程序集的信息,也可以动态的加载程序集,以及在程序集中查找类型信息,并创建该类型的实例。
    使用Assembly类可以降低程序集之间的耦合,有利于软件结构的合理化。

通过程序集名称返回Assembly对象
:

Assembly ass = Assembly.Load("MyClassLibrary");
    

通过DLL文件名称返回Assembly对象:
       

Assembly ass = Assembly.LoadFrom("MyClassLibrary.dll");
    

通过Assembly获取程序集中类: 
       

Type t = ass.GetType("MyClassLibrary.NewClass");   //参数必须是类的全名
    

通过Assembly获取程序集中所有的类:

Type[] t = ass.GetTypes();


3、反射使用代码

1)查看类中的构造方法

NewClassw nc = new NewClassw();
Type t = nc.GetType();
ConstructorInfo[] ci = t.GetConstructors();    //获取类的所有构造函数
foreach (ConstructorInfo c in ci)              //遍历每一个构造函数
{ParameterInfo[] ps = c.GetParameters();    //取出每个构造函数的所有参数foreach (ParameterInfo pi in ps)           //遍历并打印所该构造函数的所有参数{Console.Write(pi.ParameterType.ToString()+" "+pi.Name+",");}Console.WriteLine();
}

2)用构造函数动态生成对象

Type t = typeof(NewClassw);
Type[] pt = new Type[2];
pt[0] = typeof(string);
pt[1] = typeof(string);
//根据参数类型获取构造函数 
ConstructorInfo ci = t.GetConstructor(pt); 
//构造Object数组,作为构造函数的输入参数 
object[] obj = new object[2]{"cjavapy","www.cjavapy.com"};   
//调用构造函数生成对象 
object o = ci.Invoke(obj);    
//调用生成的对象的方法测试是否对象生成成功 
//((NewClassw)o).show();

3) 用Activator生成对象

Type t = typeof(NewClassw);
//构造函数的参数 
object[] obj = new object[2] { "cjavapy", "www.cjavapy.com" };   
//用Activator的CreateInstance静态方法,生成新对象 
object o = Activator.CreateInstance(t,"cjavapy","www.cjavapy.com"); 
//((NewClassw)o).show();

4)查看类中的属性

NewClassw nc = new NewClassw();
Type t = nc.GetType();
PropertyInfo[] pis = t.GetProperties();
foreach(PropertyInfo pi in pis)
{Console.WriteLine(pi.Name);
}

5)查看类中的public方法

NewClassw nc = new NewClassw();
Type t = nc.GetType();
MethodInfo[] mis = t.GetMethods();
foreach (MethodInfo mi in mis)
{Console.WriteLine(mi.ReturnType+" "+mi.Name);
}

6)查看类中的public字段

NewClassw nc = new NewClassw();
Type t = nc.GetType();
FieldInfo[] fis = t.GetFields();
foreach (FieldInfo fi in fis)
{Console.WriteLine(fi.Name);
}

7)用反射生成对象,并调用属性、方法和字段进行操作

NewClassw nc = new NewClassw();
Type t = nc.GetType();
object obj = Activator.CreateInstance(t);
//取得ID字段 
FieldInfo fi = t.GetField("ID");
//给ID字段赋值 
fi.SetValue(obj, "id11");
//取得MyName属性 
PropertyInfo pi1 = t.GetProperty("MyName");
//给MyName属性赋值 
pi1.SetValue(obj, "cjavapy", null);
PropertyInfo pi2 = t.GetProperty("MyInfo");
pi2.SetValue(obj, "www.cjavapy.com", null);
//取得show方法 
MethodInfo mi = t.GetMethod("show");
//调用show方法 
mi.Invoke(obj, null); 

8)通过程序集的名称反射

Assembly ass = Assembly.Load("MyClassLibrary");
Type t = ass.GetType("MyClassLibrary.NewClass");
object o = Activator.CreateInstance(t, "cjavapy", "www.cjavapy.com");
MethodInfo mi = t.GetMethod("show");
mi.Invoke(o, null);

9)通过DLL文件全名反射其中的所有类型

Assembly assembly = Assembly.LoadFrom("xxx.dll的路径");
Type[] aa = assembly.GetTypes();
foreach(Type t in aa)
{if(t.FullName == "a.b.c"){object o = Activator.CreateInstance(t);}
}

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

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

相关文章

基于哈夫曼树的数据压缩算法

基于哈夫曼树的数据压缩算法是一种有效的编码方法,可以对待压缩文件进行压缩(即编码),同时可以对压缩后的二进制编码文件进行解压(即译码)。以下是其工作原理: 输入一串字符串,根据…

MyBatis整合多数据源

基础环境 SpringBoot : 3.0.0 Java: jdk-17.0.5 Maven: 3.6.1引入相关jar <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

局域网协议:VLAN技术介绍

文章目录 VLAN概述VLAN的优点VLAN的原理VLAN的配置推荐阅读 VLAN概述 VLAN&#xff08;Virtual Local Area Network虚拟局域网&#xff09;是一种在物理网络基础上划分逻辑上独立的局域网的技术。它允许将网络设备按照逻辑上的需求而非物理位置进行分组&#xff0c;提供更好的…

Python除法

1.整数除以整数 练习下面的运算&#xff1a; >>> 2/5 0 >>> 2.0/5 0.4 0.4 >>> 2/5.0 0.4 >>> 2.0/5.0 0.4 看到没有&#xff1f;麻烦出来了&#xff08;这是在python2.x中&#xff09;&#x…

硬技能之上的软技巧(一)

在硬技能的基础上&#xff0c;如何运用软技巧来提升个人能力和职业发展。 硬技能通常指的是专业技能和知识&#xff0c;这些技能是我们在职场中安身立命的基础&#xff0c;也是我们能够胜任工作的关键。 常见的硬技能包括编程、设计、市场营销等。 然而&#xff0c;仅有硬技…

西门子S7-200SMART常见通讯问题解答

1台200SMART 如何控制2台步进电机&#xff1f; S7-200SMART CPU最多可输出3路高速脉冲&#xff08;除ST20外&#xff09;&#xff0c;这意味着可同时控制最多3个步进电机&#xff0c;通过运动向导可配置相应的运动控制子程序&#xff0c;然后通过调用子程序编程可实现对步进电…

读书笔记:彼得·德鲁克《认识管理》第29章 有效决策

一、章节内容概述 决策不是一项机械性工作&#xff0c;而是一种冒险&#xff0c;也是对判断力的考验。“正确答案”不是决策的核心&#xff0c;通常情况下无论如何都无法找到正确答案。决策的核心是对问题的认可。决策也不是一项智力活动&#xff0c;而是调 动组织的想象力、精…

矩阵相乘

描述 输入N和M建立矩阵A[N][M]&#xff0c; B[M][N] 矩阵C A * B 输出矩阵C 例如: 输入&#xff1a; 2 3 1 2 3 4 5 6 100 10 100 1 1000 -1 -1 输出: 123 3210 456 6540 输入 输入N和M&#xff0c;建立矩阵A[N][M]&#xff0c; B[M][N]&#xff0c;以-1&#xff0c;-1结尾 输入…

【算法-字符串1】反转字符串 + 反转字符串2

今天&#xff0c;带来字符串相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 1. 反转字符串 题意简化 题意已经很简洁。 题意转化 将字符串的顺序倒转。 解决思路(抽象) 这道题的反转可以直接调用一个库函数&#xff0c;但是这样做意义不大。 能…

单链表OJ--8.相交链表

8.相交链表 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 此题可以先计算出两个链表的长度&#xff0c;让长的链表先走相差的长度&#xff0c;然后两个链表同时走&#xff0c;直到遇到相同的节点&#xff0c;即为第一个公共节点 */struct Li…

前端学习--React(1)

一、React简介 React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 优势&#xff1a;组件化开发、不错的性能、丰富生态&#xff08;所有框架中最好&#xff09;、跨平台&#xff08;web、ios、安卓&#xff09; 开发环境搭建 打开相应文件夹 新建终端并…

QT修改windowTitle的名字以及图片

1.修改名字:点击ui的QMainWindow,然后找到windowTitle的选项修改即可 2.修改windowTitle的图片,依旧是找到windowIcon,选择资源,这个资源可以是你放到qrc里面的图片也可以是外置的图片 3.然后运行就可以看到效果了

精通Nginx(17)-安全管控

安全是每个系统都需要考虑的关键因素,Nginx在这方面提供了丰富的功能,使我们可以就实际情形做很精细调整。这些功能包括防信息暴露、客户端访问限制、通讯加密、防DDos攻击、防爬虫、防非法引用及防非法域名请求等。 目录 防信息暴露 关闭版本号 关闭目录列表 客户端访问…

行情分析——加密货币市场大盘走势(11.21)

大饼昨日笔者已经离场&#xff0c;目前下跌形态破坏&#xff0c;等待机会再入场&#xff0c;下跌是必然的&#xff0c;只是现在从MACD日线来看是要上涨的&#xff0c;上涨趋势没有打破&#xff0c;等待机会入场。 MACD日线多单策略&#xff1a;入场37500 止盈38000-38600 止损…

Java实现LeetCode题目

Leetcode707设计链表 使用Java设计一个链表 package link_list;public class Design_Link {public static void main(String[] args) {Design_Link demo new Design_Link();Design_Link.myLinkedList myLink new Design_Link().new myLinkedList();myLink.addHead(0);myLin…

OceanBase:OBServer节点管理

目录 1.查看节点 2.添加节点 2.1 创建数据目录 2.2.OceanBase 运行时所依赖的部分三方动态库 2.3.安装 OceanBase 数据库的 RPM 包 2.4.启动节点 observer 进程 2.5.向集群中添加节点 3.隔离节点 4.重启节点 4.1 停止服务 4.2 转储 4.3 关闭进程 4.4 启动进程 4.…

gitBash中如何使用Linux中的tree命令

文章目录 在gitBash中安装tree的目的如何安装安装完成,就可以直接完美适配Linux系统了在gitBash中安装tree的目的 如下图,powershell虽然可以看做是window下的Linux系统,但是根本就不适配很多Linux中的命令 如何安装 tree.exe安装网址 下载 tree 命令的 二进制包,安装 tr…

linux如何一键自动安装系统(PXE)

PXE概述 1、PXE 预启动执行环境&#xff0c;在操作系统之前运行 由Intel公司开发的网络引导技术&#xff0c;工作在Client/Server模式&#xff0c; 允许客户机通过网络从远程服务器下载引导镜像&#xff0c;并加载安装文件或者整个操作系统 2、PXE的优点 规模化:同时装配多…

C++实现:实现一个函数,接受一个n x n的矩阵并返回其行列式的值 某知名上市公司笔试题

目录 题目描述: 分析: 实现代码: 题目描述: 实现一个函数,接受一个n x n的矩阵并返回其行列式 如何求解矩阵的行列式? 1x1 矩阵 [[a]] 的行列式为 a。 2x2 矩阵 [ [a, b],[c, d]]的行列式为 a*d - b*c 通过将问题简化为 n 个大小为 n-1 x n-1的矩阵的行列式来计算,可…

[Vue warn]: Extraneous non-props attributes (class)

// 最外层多个标签&#xff0c;无法在使用子组件标签上定义 class // 会报错&#xff1a;[Vue warn]: Extraneous non-props attributes (class) // were passed to component but could not be automatically inherited // because component renders fragment or tex…