C# 反射简单介绍

时间:2022-04-24 22:16:39

原文:https://blog.csdn.net/wu1020300665/article/details/82958455

1.什么是反射

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

2.反射简单例子

平时我们写调用dll都是添加引用,然后new对象,如

C# 反射简单介绍

通过反射,我们可以实现同样的效果,而不需要添加引用,

2.1我们先加载需要反射的dll  (3种方式,第一种最常用(通常我们把需要反射的dll丢在当前路径下面))

Assembly assembly = Assembly.Load("Ruanmou.DB.Sqlserver");//1 动态加载     默认加载当前路径的dll文件,不需要后缀
   //Assembly assembly1 = Assembly.LoadFile(@"E:\online7\20160928Advanced7Course2Reflection\MyReflection\MyReflection\bin\Debug\Ruanmou.DB.Sqlserver.dll");// 必须是完整路径
                //Assembly assembly2 = Assembly.LoadFrom("Ruanmou.DB.Sqlserver.dll");// 可以是当前路径  也可以是完整路径

2.2 获取类型

比如我们引用的这个dll下面有4个类

C# 反射简单介绍

我们反射则需要这样获取

foreach (var item in assembly.GetTypes())
                {
                    Console.WriteLine(item.FullName);
                }

下面是打印出来的信息

C# 反射简单介绍

  

注:第二行的后面有个占位符,还有一个1字,这代表这是一个泛型类,有1个参数

2.3 获取方法名

foreach (var item in typeDBHelper.GetMethods())
                {
                    Console.WriteLine(item.Name);
                }

下面是打印出来的信息和类的信息

C# 反射简单介绍

C# 反射简单介绍

2.4 获取属性

foreach (var item in typeDBHelper.GetProperties())
                {
                    Console.WriteLine(item.Name);
                }

2.5 获取字段

foreach (var item in typeDBHelper.GetFields())
                {
                    Console.WriteLine(item.Name);
                }

2.6 创建对象

Assembly assembly = Assembly.Load("Ruanmou.DB.Sqlserver");//1 动态加载

Type typeDBHelper = assembly.GetType("Ruanmou.DB.Sqlserver.DBHelper");//2 获取类型信息

object oDBHelper = Activator.CreateInstance(typeDBHelper);//3 创建对象

2.7 ioc

简单来说 简单工厂+配置文件+反射=ioc

2.8 反射黑科技(破坏单例,就是调用私有的构造函数)

object oDBHelper = Activator.CreateInstance(typeDBHelper,true);//后面多了个参数

2.9 创建泛型

Type typeGeneric = assembly.GetType("Ruanmou.DB.Sqlserver.GenericClass`1"); //后面加上占位符和几个参数
                    typeGeneric = typeGeneric.MakeGenericType(typeof(int)); //必须指定类型,然后才能创建对象
                    Activator.CreateInstance(typeGeneric);

2.10 方法的调用

1. void