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加载到内存中
注:LoadFile与LoadFrom都是指定一个绝对路径
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、获取pig的Type类型
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