一、反射的定义与使用场景

反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模块包含类型,类型包含成员。反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射对它们进行访问。

使用场景:

  • 需要访问程序元数据的特性。
  • 检查和实例化程序集中的类型。
  • 在运行时构建新类型。使用System.Reflection.Emit中的类。
  • 执行后期绑定,访问在运行时创建的类型的方法。

反射是.NET中重要的机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个类型了如指掌。另外我还可以直接创建对象,即使这个对象的类型在编译时还不知道。

二、反射的用途

(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了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

三、示例

1、使用Activator创建实例对象,有两种方式

using System;
using System.Reflection;
using System.Text;namespace 反射的测试
{public class SomeType{public void DoSomething(int x){Console.WriteLine("100 / {0} = {1}", x, 100 / x);}}class Program{static void Main(string[] args){Object o = Activator.CreateInstance(typeof(SomeType));SomeType sb = (SomeType)o;sb.DoSomething(20);// Create an instance of the SomeType class that is defined in this // assembly.Console.WriteLine("CodeBase = {0}", Assembly.GetEntryAssembly().CodeBase);//"file:///F:/CodeTest/WpfApp1/反射的测试/bin/Debug/反射的测试.exe" System.Runtime.Remoting.ObjectHandle oh =Activator.CreateInstanceFrom(Assembly.GetEntryAssembly().CodeBase,typeof(SomeType).FullName);SomeType st = (SomeType)oh.Unwrap();st.DoSomething(5);Console.ReadKey();}}
}

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

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

3、通过程序集获取类对象

Assembly assembly = Assembly.Load("ReflectionDemo2");
Type t = assembly.GetType("ReflectionDemo2.ReflectionClass"); //参数必须是类的全名
object o = Activator.CreateInstance(t,"男");
MethodInfo mi = t.GetMethod("Show");
mi.Invoke(o,null);

4、获取类的字段,public,private,protect

static void Main(string[] args){Type t = typeof(RefClass);RefClass rc = new RefClass();rc.Test3 = 3;FieldInfo[] finfos = t.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);foreach (FieldInfo finfo in finfos){Console.WriteLine("字段名称:{0}  字段类型:{1} rc中的值为:{2}", finfo.Name, finfo.FieldType.ToString(), finfo.GetValue(rc));}Console.ReadKey();}

参考:

https://blog.csdn.net/Gnd15732625435/article/details/78587483?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

https://www.cnblogs.com/yaozhenfa/p/CSharp_Reflection_1.html

C#反射Activator相关推荐

  1. [IoC容器Unity]第四回:使用范例

    1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...

  2. C# 泛型约束 new() 的底层细节和性能

    注意:本文不会讲泛型如何使用,关于泛型的概念和泛型约束的使用请微软官方参考链接. https://docs.microsoft.com/zh-cn/dotnet/csharp/language-ref ...

  3. [AutoMapper]反射自动注册AutoMapper Profile

    AutoMapper 帮我我们方便管理物件跟物件之间属性值格式转换 模型转换 这里有两个类别 UserInfoModel 当作我们从DB捞取出来模型资料 public class UserInfoMo ...

  4. [C#反射]C#中的反射解析及使用.

    1.对C#反射机制的理解 2.概念理解后,必须找到方法去完成,给出管理的主要语法 3.最终给出实用的例子,反射出来dll中的方法 参考: C#反射,MSDN编程指南 反射是一个程序集发现及运行的过程, ...

  5. .net中使用反射的简单例子

    说明:由于工作原因,本人使用反射的机会不是很多,所以没有必要为了炫耀技术而使用这种技术,不过今天有人问到这方面的问题,所以做了一个简单例子,供初学者参考,代码如下: using System; usi ...

  6. C# 反射 通过类名创建类实例

    "反射"其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用 ...

  7. 黄聪:C# 反射入门知识

    1. 什么是反射 2. 命名空间与装配件的关系 3. 运行期得到类型信息有什么用 4. 如何使用反射获取类型 5. 如何根据类型来动态创建对象 6. 如何获取方法以及动态调用方法 7. 动态创建委托 ...

  8. java 反射深度克隆_C#使用反射(Reflection)实现深复制与浅复制

    原文路径:https://blog.csdn.net/qq_28839293/article/details/79487294 1.浅复制: class Program { public static ...

  9. C#反射(Reflection)详解

    1. 什么是反射 2. 命名空间与装配件的关系 3. 运行期得到类型信息有什么用 4. 如何使用反射获取类型 5. 如何根据类型来动态创建对象 6. 如何获取方法以及动态调用方法 7. 动态创建委托 ...

  10. C#的反射机制调用方法

    .NET的反射(Reflection)是非常完善和强大的,例如有名的.NET反编译工具Red Gate's .NET Reflector就是使用了.NET自身的反射机制,这里有一个比较简单的实例(使用 ...

最新文章

  1. zk如何实现watch
  2. python字符串大写字母个数_python判断字符串是字母 数字 大小写(转载)
  3. 机器学习入门系列二(关键词:多变量(非)线性回归,批处理,特征缩放,正规方程
  4. 成长型公司的存储架构
  5. nodejs与npm版本对应表
  6. 阿里的 RocketMQ 如何让双十一峰值之下0故障
  7. 华为主题包hwt下载_华为主题 | 黑白人物
  8. Mr.J--树、二叉树、森林的转换
  9. NO.3 寻找数组主要元素
  10. Spring实战(开发Web应用)
  11. 创建联系人vcf文件通讯录
  12. 入门OSPF就这一篇足够了
  13. Kryo官方文档学习笔记
  14. python3实现批量修改图片名称
  15. 干货!!史上最全Java学习视频
  16. android分析内存工具,Android Studio内存泄漏分析工具汇总
  17. MYOJ 的来源和现状
  18. linux java下载
  19. 读书感受 之 《菊与刀》
  20. IEEE顶级期刊和会议-车辆动力学及其控制和计算机视觉CV

热门文章

  1. 传真SIP会话发起协议(SIP)
  2. python旋转图片
  3. Linux(九、十)文件权限及网络配置管理
  4. 毕业设计 基于stm32的居民小区火灾检测报警系统 - 物联网 嵌入式
  5. 无源贴片晶振四角引脚_有源晶振四引脚详细用法
  6. php主机卫士,Bypass 360主机卫士SQL注入防御(多姿势)
  7. 服务器与操作系统的区别是什么,服务器系统和普通用户操作系统有何区别
  8. 自制太阳能手机充电器
  9. vivo X9s的USB调试模式在哪里,打开vivo X9sUSB调试模式的经验
  10. python字典内置方法_python之字典二 内置方法总结