概念和关键类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);
posted @ 2025-03-14 16:59  cannedmint  阅读(6)  评论(0)    收藏  举报