反射就是使用代码动态的获取类型信息。
类型:值类型(int ,bool,struct..)引用类型(string,array,自定义类...)
内容:字段,属性,构造函数,方法...
如果需要获取类型的信息,就需要获取类型的Type对象,虽然通过实例化对象可以访问成员的信息,但是有局限性,比如类型的私有成员,泛型接口约束,接口实现 ,基类等仅仅依靠实例化对象很难获取,但是使用Type对象就可以简单的了解类型的全面信息。
获取Type类对象方法:
1.对象.GetType(); //object的方法
2.Typeof(类型空间.类名);
3.Type.GetType(“类型空间.类名”); //Type的方法
反射之字段:
class Person
{
private int id = 43285; //私有字段
public string name; //公共字段
public int age=15; //公共字段
}
public class Mainclus
{
internal static void Main(string[] args)
{
Type type= typeof(demo2.Person); //获取类型对象
//获取公共的访问字段,上述的id是获取不到的,可以用GetFields函数的重运载方法获取,如FieldInfo[] fieldInfos= type.GetFields(BindingFlags.Static);重运载的参数是枚举类型,下图截取了一点适用不同的类型。无参数是默认获取公共字段
FieldInfo[] fileInfo= type.GetFields();
foreach (FieldInfo fi in fileInfo)
{
Console.WriteLine($"字段类型:{fi.FieldType},字段值:{fi.GetValue(new Person())}"); //要获取非静态字段信息,要实例化,如果是静态字段,填写null。
}
//我们还可以设置name的值,name是非静态的,所以要实例化
Person person= new Person();
FieldInfo fieldInfo01 = type.GetField("name"); //type.GetField是获取单个字段信息
fieldInfo01.SetValue(person, "湖南");//参数是给什么对象赋给什么值,如果是静态字段就填null
Console.WriteLine(fieldInfo01.GetValue(person));
}
<