概述
程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类、函数、变量等来实例化它们,执行它们,操作它们,实际上就是获取程序在内存中的映像,然后基于这个映像进行各种操作。
Type用法举例
Type对象用来获取对象的类型信息,如:构造函数、方法、字段、属性和类的事件等。Type的用法有以下三种:
方法1:直接通过typeof获取类型;
方法2:通过类型实例获取类型a.GetType(); .
方法3:通过Type类的静态方法Type.GetType("System.String");
用法举例:
string a = "zls";var c1 = typeof(string);var c2 = a.GetType();var c3 = Type.GetType("System.String");Console.WriteLine($"c1类型:{c1}");Console.WriteLine($"c2类型:{c2}");Console.WriteLine($"c3类型:{c3}");Console.ReadKey();
运行结果:

其中方法3有六个重载方法,F12可以查看详细解释,如果要忽略大小写搜索,可以用以下这个重载:将ignoreCase设置为true
public static Type GetType(string typeName, bool throwOnError, bool ignoreCase);获取类型的详细信息,如下:
Console.WriteLine("命名空间:" + c1.Namespace);Console.WriteLine("基类型:" + c1.BaseType);Console.WriteLine("全名称:" + c1.FullName);Console.WriteLine("是否是类:" + c1.IsClass);Console.WriteLine("是否是公共类型:" + c1.IsPublic);Console.WriteLine("类型所在程序集:" + c1.Assembly);

Type常用方法介绍
① 如果要获取获取类中的所有公共成员,可以使用GetMembers();
//// 摘要:// 返回为当前 System.Type 的所有公共成员。//// 返回结果:// 表示当前 System.Reflection.MemberInfo 的所有公共成员的 System.Type 对象数组。- 或 - 如果当前 System.Reflection.MemberInfo// 没有公共成员,则为 System.Type 类型的空数组。public MemberInfo[] GetMembers();
MemberInfo[]位于名称空间System.Reflection下,所以需要引用下.
用法举例:
MemberInfo[] infos = c3.GetMembers();for (int i = 0; i < infos.Length; i++){Console.WriteLine(infos[i]);}
运行结果:

② 此外你也也可以获取类的公共构造函数并调用,
ConstructorInfo[] ctors = c1.GetConstructors();比如这里定义一个学生类型:
public class Student{public Student(){Name = "zls";Age = 18;}public string Name { get; set; }public int Age { get; set; }}
然后获取学生的年龄:
var t1 = typeof(Student);//得到无参构造函数ConstructorInfo info = t1.GetConstructor(new Type[0]);//执行无参构造 无参构造没有参数传nullStudent obj = info.Invoke(null) as Student;Console.WriteLine(obj.Age);
运行结果:18
③ 获取所有公共属性
PropertyInfo[] propertyInfos = c1.GetProperties();用法举例:
var t1 = typeof(Student);//得到无参构造函数ConstructorInfo info = t1.GetConstructor(new Type[0]);//执行无参构造 无参构造没有参数传nullStudent obj = info.Invoke(null) as Student;Console.WriteLine(obj.Age);PropertyInfo infoJ = t1.GetProperty("Age");Console.WriteLine(infoJ.GetValue(obj));

④ 获取所有公共字段:
FieldInfo[] fileldInfos = t.GetFields();给学生类增加一个字段:
public class Student{public Student(){Name = "zls";Age = 18;id = 20;}public string Name { get; set; }public int Age { get; set; }public int id;}
然后获取字段值
var t1 = typeof(Student);//得到无参构造函数ConstructorInfo info = t1.GetConstructor(new Type[0]);//执行无参构造 无参构造没有参数传nullStudent obj = info.Invoke(null) as Student;Console.WriteLine(obj.Age);PropertyInfo infoJ = t1.GetProperty("Age");Console.WriteLine(infoJ.GetValue(obj));FieldInfo inf = t1.GetField("id");Console.WriteLine(inf.GetValue(obj));

当然除了上面获取属性和字段值的方法我们也可以设置他的值:
方法如下:
inf.SetValue(obj, 99);Console.WriteLine(inf.GetValue(obj));

⑤ 获取类的公共成员方法,获取成员方法可以通过Type类中的GetMethod方法来得到类中的方法,MethodInfo是方法的反射信息。
MethodInfo[] methods = c1.GetMethods();这里不详细介绍用法.