反射
慎用 !!! 一般用在实在是正常手段不好解决时,在考虑反射
using UnityEngine;
//普通的类
class Hero {
//特征
//字段
public string name = "xiaoming";
public bool isMan = true;
public char sex = 'M';
//行为
}
//面向对象的编程语言做成一个类
//类 方法 属性 字段 委托
public class Class { //描述类别的类
//存储hero类里的所有字段 object是初始值 具体的值是每个对象的值
public Dictionary<string,object> fields;
//字段可以存 方法可以存 属性可以存 ......
//比如现在有几个字段
private string equip01;
private string equip02;
private string equip03;
private string equip04;
private string equip05;
private string equip06;
}
public class Method { // 当然想这些 都不需要写 C# 已经写好了
}
public class BasicRef : MonoBehaviour {
private void Start(){
Hero anni = new Hero();
//anni.e <---正常方式 点不出来
//通过反射方式可以拿到 给他赋值
//获取的方式是传入一个名字
for(int i = 1; i < 7; i++){
string equipFieldName = "equip0" + i.ToString();
//等拼好之后就可以通过equipFieldName拿到anni里面的字段
}
//这样写的好处
//anni ----> Hero 拿到一个对象可以知道 他是哪个类别的 这个类别 有哪些属性 字段 值 方法 这就是反射
//通过一个对象可以知道他所有的东西 包括私有的属性 字段 ......
//hero的类
Class hero = new Class();
//person的类
Class person = new Class();
}
}
通过反射获取类型
有三种方式 只有获取类型才能进行下一步操作
这里的Type相当于上面创建的Class
//第一种方式
//如果没有引用System这里就要写 Type类型的意思,用来存储 typeof不是方法,是关键词 拿到类名
System.Type t = typeof(PersonNameSpace.Person);
//第二种方式
//有一个对象 不知道这个对象属于哪个类的 就想知道它的类型
PersonNameSpace.Person p = new PersonNameSpace.Person();
System.Type t = p.GetType();
//第三种方式
//传入的是字符串,比第一种和第二种用的少
System.Type t = System.Type.GetType("System.String");
using UnityEngine;
using System;
using System.Reflection;
namespace Framework {
public class Hero { //在Framework 命名空间下的
public string name = "xiaoming";
public int attack = 100;
}
}
class Person { // 在程序集里的
public string name = "xiaoming";
public char sex = 'M';
}
public class RefOperation : MonoBehaviour {
private Framework.Hero dmxy = new Framework.Hero();
private void Start(){
ShowTypeField();
}
//如何获取类型
private void RefGetType(){
//通过typeof获取某个类的类型①
System.Type personType = typeof(Person); // <----只要是类名 都可以往里放 GameObject Transform
//如果有命名空间 要写上命名空间 另一种方式 在最上方要引用命名空间 using Framework;
System.Type heroType = typeof(Framework.Hero);
//通过一个对象获取该对象所对应的类的类型②
System.Type dmxyType = dmxy.GetType();
//①和②的区别在于第一种是类型,第二种是对象
//通过类的名称字符串获取对应的类型③
System.Type strType = System.Type.GetType("Person");
System.Type newStrType = System.Type.GetType("Framework.Hero");//有命名空间要加上命名空间
//这样三种方式都能拿到Type 拿到之后就可以点里面的东西
}
//看看type里面有哪些字段
private void ShowTypeField(){
//获取类型
Type heroType = typeof(Framework.Hero);
//查看类型属性
Debug,Log("Name:" + heroType.Name);
//查看类型的全名
Debug.Log("FullName:" + heroType.FullName);
}
//看看type的方法
private void ShowTypeMethod(){
//获取类型
Type heroType = typeof(Framework.Hero);
MemberInfo[] infos = heroType.GetMember("name");
//搞一搞unity的看看有啥
Type goType = typeof(GameObject);
//获取一个类的所有非公有成员
MemberInfo[] memberInfos = goType.GetMembers(BindingFlags.NonPublic);
//公有和静态的组合
//MemberInfo[] memberInfos = goType.GetMembers(BindingFlags.Public | BindingFlags.Static);
for(int i = 0;i < memberInfos.Length;i++){
Debug.Log(memberInfos[i].Name);
}
}
}
代码架构
程序集 mscorlib 如果不写命名空间直接在这里写类 那这个类就属于 这个程序集
命名空间
命名空间
类
结构体
子命名空间
类
结构体
子命名空间
类