反射

it2022-05-05  101

Reflection,中文翻译为反射。

要使用反射必须引用反射的命令空间:using system.Reflection

一、基本概念:

反射:反射是一个运行库类型发现的过程。通过反射可以得到一个给定程序集所包含的所有类型的列表,这个列表包括给定类型中定义的方法、字段、属性和事件。也可以动态的发现一组给定类支持的接口、方法的参数和其他相关信息如基类、命名空间、数据清单等

1、Assembly 通过它可以加载、了解和操纵一个程序集

2、AssemblyName 通过它可以找到大量隐藏在程序集的身份中的信息,如版本信息、区域信息等。

3、EventInfo 事件的信息

4、FieldInfo 字段的信息

5、MethodInfo 方法的信息

6、ParameterInfo 参数的信息

7、PropertyInfo 属性的信息

8、MemberInfo  是抽象基类,为EventInfo、FieldInfo、MethodInfo、PropertyInfo 等类型定义的公共的行为

9、Module 用来访问带有多文件程序集的给定模块

 

Assembly 这个类是负责将你的程序集加载到内存中的

Type:负责将程序集中所有的类以每个Type对象进行一一对应,一个Type对应着一个类

PropertInfo:对应着程序集中的每一个属性

MethodInfo:对应着程序集中的每一个方法

FeildInfo:对应着程序集中每一个私有字段

 

案例:

//1、将pig类所在的程序集Lib.dll加载到内存中 

Assembly  ass =  Assembly.load(“只需要指定程序集的名称:Lib”)

//2、必须使用反射动态创建对象

Object pigInstance = ass.CreateInstance(“Lib.pig”) //参数:命名空间.类 ---- 相当于new了一个pig

//3、先给pig中的name赋值

Type pigType = ass.getType(“Lib.pig”)  //先拿到pig

PropertyInfo nameInfo = pigType.GetProperty(“Name”)  //得到Name属性

//4、给Name属性赋值.net4.5的写法)

nameInfo.SetValue(“pigInstance ”,”猪八戒”)

//4、给Name属性赋值.net4.0的写法)

nameInfo.SetValue(“pigInstance ”,”猪八戒”,null)

//5、获取pig中的name属性

Object obj = nameInfo.getValue(pigInstance )

//6、显示

MessageBox.Show(obj)

 

将程序集加载到内存中:

1、根据指定物理路径将.dll加载到内存中   

   注:LoadFileLoadFrom都是指定一个绝对路径

   Assembly ass = Assembly.LoadFile(@"G:\反射\Lib\bin\Debug\lib.dll")

 

   Assembly ass = Assembly.LoadFrom(@"G:\反射\Lib\bin\Debug\lib.dll")

 

2、扫描当前运行目录下的指定程序集名称的 程序集 加载到内存中(常用)

   Assembly ass = Assembly.Load(“lib”)

 

3、获取当前程序域中所有的Assembly

   Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();

 

4、获取pigType类型

   Assembly ass = Assembly.Load(“lib”) //将程序集加载到内存中

   Type pigType = ass.GetType(“lib.pig”);  //获取到lib程序集中pig

 

   Type[] allType = ass.GetTypes(); //获取程序集中所有类的Type(包括私有,保护的,共有的)

 

5、获取当前程序集中的pig类,但是忽略大小写

   //参数:完全限定名称  是否抛出异常  是否忽略大小写

   Type pigType = ass.GetType(“lib.pig”,false,true) 

 

6、获取程序集中定义的所有的public

   Type[] publicType = ass.ExportedTypes();

 

 

 

转载于:https://www.cnblogs.com/h123/p/4741164.html


最新回复(0)