C#中反射的使用总结

news/2024/10/22 22:50:52/

反射是.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.ppmy.cn/news/1239381.html

相关文章

linux如何获取CPU使用率

Linux 中 一切皆为文件 的设计理念带来了许多好处: 统一接口: 使用相同的 API 可以对所有类型的文件进行操作,例如读取、写入、移动、删除、修改权限等 简化管理: 使用相同的工具和方式来管理文件和设备的操作,例如备份、复制、移动、删除、链接等 编程…

电源控制系统架构(PCSA)之电源管理基础设施组件

目录 6.5 电源管理基础设施组件 6.5.1 电源策略单元 6.5.2 时钟控制器 6.5.3 低功耗Distributor 6.5.4 低功耗Combiner 6.5.5 P-Channel到Q-Channel转换器 6.5 电源管理基础设施组件 6.5.1 电源策略单元 本节介绍电源策略单元(Power Policy Unit, PPU)。PPU的完整细节见…

CF -- Educational Codeforces Round 158 (Rated for Div. 2) -- D 补题记录

Yet Another Monster Fight Problem - D - Codeforces 题目大意: 现在给你一堆怪物,你拥有法术(一个法术可以连续攻击这n个所有怪物),你可以选择任意一个怪物作为法术的第一个攻击目标(伤害为x&#xff…

虹科Pico汽车示波器 | 汽车免拆检修 | 2017款东风本田XR-V车转向助力左右不一致

一、故障现象 一辆2017款东风本田XR-V车,搭载R18ZA发动机,累计行驶里程约为4万km。车主反映,车辆行驶或静止时,向右侧转向比向左侧转向沉重。 二、故障诊断 接车后试车,起动发动机,组合仪表上无故障灯点亮&…

探索网络模型与协议:从OSI到HTTPs的原理解析

一、OSI网络模型 OSI(Open Systems Interconnection)七层网络参考模型和TCP/IP四层模型都是用于理解和设计计算机网络的框架,但它们之间存在一些差异。 1、七层 vs 四层 OSI七层网络参考模型: 物理层(Physical Laye…

Ubuntu中安装搜狗输入法教程(详细图文教程)

习惯了使用搜狗输入法,这里总结了Ubuntu系统下安装搜狗输入法的详细教程,每个步骤都很详细,耐心安装。 搜狗输入法是一款功能强大、使用方便的输入法,能够有效提升用户在Ubuntu系统中的输入体验。 目录 一、下载搜狗安装包1.1 搜…

Redis大key与热Key

什么是 bigkey? 简单来说,如果一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey。具体多大才算大呢?有一个不是特别精确的参考标准: bigkey 是怎么产生的?有什么危害?…

Xilinx Zynq-7000系列FPGA实现视频拼接显示,提供两套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA视频拼接叠加融合方案推荐 3、设计思路详解Video Mixer介绍 4、工程代码1:2路视频拼接 HDMI 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程代码2:4路视频拼接 HDMI 输出PL 端 FPGA 逻辑设…