反射 代码架构

本文详细介绍了C#编程中反射的概念及其使用,包括如何通过反射获取类的类型、字段和方法。示例代码展示了如何通过反射动态访问和修改对象的私有属性,以及获取类的类型信息。此外,还探讨了获取类型的不同方式,如typeof关键字、对象的GetType方法和通过字符串名称获取类型。
摘要由CSDN通过智能技术生成

反射

慎用 !!! 一般用在实在是正常手段不好解决时,在考虑反射

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   如果不写命名空间直接在这里写类 那这个类就属于 这个程序集
	命名空间
	命名空间
		类
		结构体
		子命名空间
            类
            结构体
            子命名空间
	类

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值