概念和关键类type
反射的概念
程序正在运行时,可以查看其他程序集或者自身的元数据
一个运行的程序查看本身或者其他程序元数据的行为就叫反射
反射的作用
反射可以在程序编译后获得信息,提高程序的拓展和灵活性
class Test
{
private int i =1;
public int j =0;
public string str ="123";
public Test()
{
}
public Test (int i)
{
this.i = i;
}
public Test (int i string str):this(i)
{
this.str=str;
}
public void Speak()
{
Console.WriteLine(i);
}
}
//Type(类的信息类)
//反射功能的基础,访问元数据的主要方式
//GetType()可以获得对象的Type
int a =42;
Type type = a.GetType();
Console.WriteLine(type);
//通过typeof传入类名也可以得到对象的Type
Type type2 = typeof(int);
Console.WriteLine(type2);
//通过类的名字也可以获取类型
//注意类名必须包含命名空间
Type type3 = Type.GetType("System.Int32");
Console.WriteLine(type3);
//得到类的程序集信息
Console.WriteLine(type.Assembly);
//获取类中的所有公共成员
//首先得到Type
Type t = typeof(Test);
//然后得到所有公共成员
//需要引用命名空间
MemberInfo[] infos = t.GetMembers();
for (int i = 0;i <infos.Length;i++)
{
Console.WriteLine(infos[i]);
}
//获取类的公共构造函数并调用
//获取所有的构造函数
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]);
//执行无参构造,无参构造没有参数传入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;
Console.WriteLine(obj.str);
ConstructorInfo info3 = t.GetConstructor(new Type[]{typeof(int),typeof(string)});
obj = info3.Invoke(new object[]{4,"444"}) as Test;
//获取类的公共成员变量
//得到所有成员变量
FieldInfo[] fieldInfos = t.GetFields();
for (int i =0;i<fieldInfos.Length;i++)
{
Console.WriteLine(fieldInfos[i]);
}
//得到指定名称的公共成员变量
FieldInfo infoj = t.GetField("j");
Console.WriteLine(infoJ);
//通过反射获取和设置对象的值
Test test = new Test();
test j =99;
test.str = "2222";
//通过反射获取对象的某个变量的值
Console.WriteLine(infoJ.GetValue(test));
//通过反射设置指定对象的某个变量的值
infoJ.SetValue(test,100);
Console.WriteLine(infoJ.GetValue(test));
//获取类的公共成员方法
//通过Type类中的GetMethod方法得到类中的方法
//MethodInfo是方法的反射信息
Type strType=typeof(string);
//如果方法存在重载,用Type数组表示参数类型
MethodInfo[] methods = strType.GetMethods();
for (int i =0;i<methods.Length;i++)
{
Console.WriteLine(methods[i]);
}
MethodInfo subStr = strType.GetMethod("Substring",new Type[]{typeof(int),typeof(int)});
//调用该方法
//如果是静态方法,invoke中第一个参数传null即可
string str = "Hello,World" ;
//第一个参数是指定的对象,如果是静态方法直接传null
object res = subStr.Invoke(str,new object[]{7,5});
Console.WriteLine(res);

浙公网安备 33010602011771号