获取反射的三种方式
Student stu = new Student();
Type type = typeof(Student);
Type type = stu.GetType();
Type type = Type.GetType(); // 注意该方法有具体的使用规则
BindingFlags
用于限制获取成员的类型,不写的话只能查找到公共成员。一般BindingFlags.Instance
与BindingFlags.Static
必要有一个,是静态成员就用BindingFlags.Static
,是实例成员就用BindingFlags.Instance
,也可以两者都写。注意:BindingFlags.NonPublic
用于获取非公共成员
代码
using System;
using System.Reflection;
using UnityEngine;
public class ReflectionTest : MonoBehaviour
{
class Student
{
public string Name; // 公共字段
private int Age = 10; // 私有字段
protected int Score { get; set; } = 80; // 非公共属性
protected void GoHome() // 非公共方法
{
Debug.Log(Age + "岁的" + Name + "回家了");
}
public void GoToSchool() // 公共方法
{
Debug.Log(Age + "岁的" + Name + "上学去了");
}
}
public void Awake()
{
Student stu = new Student() { Name = "Tom"};
Type type = typeof(Student);
// 获取私有方法
MethodInfo methodInfo = type.GetMethod("GoHome", BindingFlags.Instance | BindingFlags.NonPublic); // 后面的BindingFlags用于限制查找方法的类型,默认不写的话只能查找到公共方法
methodInfo.Invoke(stu, null);
// 获取私有字段
FieldInfo fieldInfo = type.GetField("Age", BindingFlags.Instance | BindingFlags.NonPublic);
Debug.Log(fieldInfo.Name + ":" + fieldInfo.GetValue(stu));
// 获取私有属性
PropertyInfo propertyInfo = type.GetProperty("Score", BindingFlags.Instance | BindingFlags.NonPublic);
Debug.Log(propertyInfo.Name + ":" + propertyInfo.GetValue(stu));
// 通过反射创建对象
Student stu2 = Activator.CreateInstance(type) as Student;
stu2.Name = "Jake";
stu2.GoToSchool();
}
}