概述
程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类、函数、变量等来实例化它们,执行它们,操作它们,实际上就是获取程序在内存中的映像,然后基于这个映像进行各种操作。
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]);
//执行无参构造 无参构造没有参数传null
Student 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]);
//执行无参构造 无参构造没有参数传null
Student 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]);
//执行无参构造 无参构造没有参数传null
Student 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();
这里不详细介绍用法.