目录
1 万物之父object中GetType()可以获取对象的Type
1.知识点回顾
编译器是一种翻译程序,它用于将源语言程序翻译为目标语言程序。
源语言程序:某种程序设计语言写成的,比如:C#,C++,Java等语言写的程序。
目标语言程序:二进制数表示的伪机器代码写的程序。
2.什么是程序集?
程序集是由编译器编译得到的,供进一步编译执行的那个中间产物。
在WINDOWS系统中,它一般表现为后缀为-dll(库文件)。
简单的说,程序集就是我们写的一个代码集合,我们现在写的所有代码最终都会被编译器翻译为一个程序集供别人使用,比如代码库文件(dll)或者一个可执行文件(exe)
3.元数据
元数据就是用来描述数据的数据。这个概念不仅仅用于程序上,在别的领域也有元数据。
简单的说,程序中的类,类中的元素,变量等等信息就是程序的元数据。有关程序以及类型的数据被称为元数据,它们保存在程序集中。
4.反射的概念
程序正在运行时,可以查看其他程序集或者自身的元数据。
简单点说,在程序运行时,通过反射可以得到其他程序集或者自己程序集代码的各种信息,包括类,函数,变量,对象等等,实例化它们,操作它们,执行它们。
5.反射的作用
因为反射可以在程序编译后获得信息,所以它提高了程序拓展性和灵活性。
1 程序运行时得到所有元数据,包括元数据的特性。
2 程序运行时,实例化对象,操作对象
3 程序运行时创建新的对象,用执行对象执行任务。
6.Type语法相关
1 万物之父object中GetType()可以获取对象的Type
int a=42;
Type t=a.GetType();
Console.WriteLine(t);
通过此类方法可以获得任意的对象类型
2 通过typeof关键字传入类名也可以得到对象的Type
Type t2=typeof(int);
Console.WriteLine(t2);
3 通过类的名字也可以获取类型
注意类名必须包含命名空间。不然找不到,如果此时不加上System就不会打印出相关的信息,通过点出来使用。
Type t3=Type.GetType("System Int32");
Console.WriteLine(t3);
三个Type实际上都是指向同一个类
4 得到类的程序信息
Console.WriteLine(t.Assembly);
5 获得类的所有公共成员
通过这种方法可以获得一个类的所有元数据,类在程序集中时,可以直接用typeof,如果不在,一般用类名。
//首先得到Type
Type t=typeof(Test);
//然后得到所有公共成员,需要引用命名空间
//using System.Reflection;
MemberInfo[] infos= t.GetMembers();
for(int i=0;i<infos.Length;i++)
{
Console.WriteLine(infos[i]);
}
6 获得类的公共构造函数并调用
获取所有构造函数
ConstructorInfo[] ctors=t.GetConstructors();
for(int i=0;i<ctors.Length;i++)
{
Console.WriteLine(ctors[i]);
}
获取其中一个构造函数并且执行
得到构造函数传入Type数组,数组中内容按顺序是参数类型。
执行构造函数传入object数组,表示按顺序传入的参数。
得到无参构造
ConstructorInfo info=t.GetConstructor(new Type[0]);
//意思是数组长度为0的无参构造函数
执行无参构造,无参构造没有参数传null
Test obj=info.Invoke(null) as Test;
Console.WriteLine(obj.j);
得到有参构造
ConstructorInfo info2=t.GetConstructor(new Type[ ]{typeof(int)});
obj=info2.Invoke(new object[ ] {2})as Test;
参数数量是对应的。
多个参数
ConstructorInfo info3=t.GetConstructor(new Type[ ]{typeof(int),typeof(string) });
obj=info3.Invoke(new object[ ] {2,"NicolePotter"})as Test;
7 获取类的公共成员变量
得到所有成员变量->得到指定名称的公共成员变量
FieldInfo[ ] fieldInfos=t.GetFields();
for(int i=0;i<fieldInfos.Length;i++)
{
Console.WriteLine(fieldInfos[i]);
}
FieldInfo info=t.GetField("j");
Console.WriteLine(info);
8 通过反射获取和设置对象的值
Test t=new Test();
t.j=99;
t.str="Nicole";
//获取对象的某个变量的值
info.GetValue(t);
//设置对象的值
info.SetValue(t,100);
9 获取类的公共成员方法
通过Type类中的GetMethod方法得到类中的方法。
MethodInfo是方法的反射信息
Type strT=typeof(string);
MethodInfo[ ] methods=strT.GetMethods();
如果存在方法重载,用Type数组表示参数类型
MethodInfo subS=strT.GetMethod("Substring",new Type[ ] {typeof(int),typeof(int)});
调用该方法
如果是静态方法,第一个参数传null
string str="Nicole Potter";
第一个参数相当于是对象执行这个成员方法
object result =subS.Invoke(str,new object[]{7,5});
7.其他
得到枚举
GetEnumName GetEnumNames
得到事件
GetEvent GetEvents
得到接口
GetInterface GetInterfaces
得到属性
GetProperty GetPropertys