推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客
  • QQ群:1040082875

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

你的点赞就是对博主的支持,有问题记得留言:

一、前言

今天分享一个平时开发比较少接触到的概念——反射,最近也是在写代码的时候用到了,就分享出来,一方面是对自己学到的知识的总结,另一方面也是为了帮助后来的人。

反射虽然用的不多,但是存在既有道理,在接下来的小节中会讲到反射的应用场景。

二、C#反射(Relection)学习

2-1、什么是反射

反射,英文名Relection,是.Net中获取运行时类型信息的方式,.Net的应用程序由三部分组成:

  • 程序集(Assembly)
  • 模块(Module)
  • 类型(Class)

而反射提供一些借口,让程序可以在程序运行时获得这几个组件的信息,比如说:

  • 获取正在运行的程序集,根据程序集中的类型信息,创建该类型的实例。
  • 获取对象的类型信息,比如方法、构造器、属性等。
  • 获取类的方法名称、参数、返回值等。

总结一句话就是:程序访问、检测和修改它本身状态的一种机制,动态创建实例并执行其中的方法。

2-2、反射的应用场景

说了这么多,反射好像很有用,又好像很没用的样子,到底什么地方用到呢?

反射主要在下列情况中很有用:

  • 在运行时查看特性信息,访问程序元数据中的属性。
  • 在运行时查看集合中的类型,并且实例化这些类型。
  • 在运行时构建新类型,并且使用这些类型执行一些任务。
  • 在运行时绑定、访问创造类型的方法。

举个简单的例子,我们有一个程序play.exe,使用了say.dllwalk.dll,突然客户说要增加一个跑的功能,那么我们只需要按照我们约定的规则制作一个run.dll,之前的play.exe就不需要做任何修改,就能直接使用run.dll,就不需要再打开编辑器,将run.dll导进去,再生成play.exe


更多作用参看下表(该表引用自https://blog.csdn.net/q493201681/article/details/82623802):

类 型 作用
Assembly 定义和加载程序集,加载程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。
Module 了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
ConstructorInfo 了解构造器的名称,参数,访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。
MethodInfo 了解方法的名称,返回类型,参数,访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用type的GetMethods或GetMethod方法来调用特定的方法。
FieldInfo 了解字段的名称,方法修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
EventInfo 了解事件的名称,事件处理程序数据类型,自定义特性,声明类型或反射类型等,并添加或移除事件处理程序。
PropertyInfo 了解属性的名称,数据类型,声明类型,反射类型和只读或可写状态等,并获取或设置属性值。
ParameterInfo 了解参数的名称,数据类型,参数是输入参数还是输出参数等,以及参数在方法签名中的位置等。

2-3、运行时获得类型信息有什么用

说了这么多,可能有人会说,我运行时获得类型信息有什么用,我在开发时就能够写好代码呀,干嘛还放到反射中去做呢,不仅麻烦,效率也不行。

这就是一个仁者见仁、智者见智的问题了,就跟早绑定和晚绑定一样,都有不同的应用场景。

存在即合理,合适的使用能够大大提高程序的复用性和灵活性,但是有优点就有缺点。

2-4、反射的优缺点

优点:

  • 提高了程序的灵活性和拓展性
  • 减低耦合性,提高程序适应能力
  • 允许在运行时创建和控制类对象,无序提前硬编码目标类

缺点:

  • 反射是一种解释操作,在使用的时候效率要比直接代码要慢,推荐使用在对灵活性和拓展性要求比较高的项目中。
  • 反射会让代码变得复杂,反射绕过了源代码的技术,对于维护会带来一些问题,比直接代码要复杂。

2-5、反射的应用实例

1、获取程序集信息和类型信息

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Reflection;
using System;public class ReflectionGetInfo : MonoBehaviour
{public string Name;public int Age;public bool Sex;public void Fun1(){}public void Fun2(){}void Start(){//获取类型Type t = GetType();Debug.Log(t.Name);//类名Debug.Log(t.Namespace);//所属命名空间Debug.Log(t.Assembly.ToString());//程序集信息FieldInfo[] fi = t.GetFields();//获取类中的字段foreach (var f in fi)Debug.Log(f.Name);MethodInfo[] mh = t.GetMethods();//获取所有的方法foreach (var h in mh)Debug.Log(h.Name);}
}

运行结果:

2、动态创建类型实例并执行其中的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Reflection;public class CreateReflectionDemo : MonoBehaviour
{void Start(){//动态创建类,并执行方法CreateReflectionClass(1);}private void CreateReflectionClass(int index){string AssemblyName = Assembly.GetExecutingAssembly().GetName().Name;//获取程序集名称string strNameSpace = MethodBase.GetCurrentMethod().DeclaringType.Namespace;//获取命名空间名称;string strClassName = "Fun" + index;//获取类型名string fullclassName = strNameSpace + "." + strClassName;//类全名(命名空间.类名称)MyClass mys = (MyClass)Assembly.Load(AssemblyName).CreateInstance(fullclassName);mys.GetResult();}
}
public interface MyClass
{void GetResult();
}
public class Fun1 : MyClass
{public void GetResult(){Debug.Log("I'm Fun1");}
}
public class Fun2 : MyClass
{public void GetResult(){Debug.Log("I'm Fun2");}
}

运行结果:

三、后记

今天分享了什么是反射,以及反射的使用方法。

反射主要是在运行时获得类型信息的方式,还可以动态创建实例并执行其中的方法。

然后使用了一个简单实例进行演示如何使用反射,但是反射的用法还有很多,需要读者自行摸索。


博主还有跟多宝藏文章等待你的发掘哦:

专栏 方向 简介
Unity3D开发小游戏 小游戏开发教程 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶 入门 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

【Unity3D日常开发】Unity3D中 C#反射Reflection的使用相关推荐

  1. 【Unity3D日常开发】Unity3D中实现计时器工具类-正计时、倒计时、暂停计时、加速计时

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  2. 【Unity3D日常开发】Unity3D中打包WEBGL后读取本地文件数据

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  3. 【Unity3D日常开发】Unity3D打包PC窗口化打包设置

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  4. 【Unity3D日常开发】解析Txt文档,赋值给Text案例

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 有小伙伴跟我说,公司现在需要解析JSON,但是百度的解析JSON的 ...

  5. Java中的反射(Reflection)为什么叫“反射”?什么是“正射”?如何自定义注解并解析?

    文章目录 反射的定义 什么是"正射" 反射的作用 反射的定义 计算机科学中的反射(reflection) 指计算机程序在运行时(runtime) 可以访问.检测和修改它本身状态或行 ...

  6. 【Unity3D日常开发】Unity中的资源加载与文件路径

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  7. 【Unity3D日常开发】Unity3D中实现屏幕坐标和3维空间坐标的转化

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  8. 【Unity3d日常开发】Unity3D中实现热力图、风向图、温度图效果

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  9. 【Unity3D日常开发】Unity中Destroy()函数 和 DestroyImmediate()函数的区别

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  10. 【Unity3D日常开发】Unity3D中实现手指任意拖动物体

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 手指拖动物体,也是交互中比较常见的一种操作,那么就让我们来看看怎么 ...

最新文章

  1. 微服务实战(一):微服务架构的优势与不足
  2. NEC:借助AI撬动未来物联网世界
  3. requests payload_python+Requests接口自动化测试之传递 URL 参数
  4. vs编译慢原因和解决方法
  5. 【mysql的编程专题⑥】视图
  6. LeetCode每日一题 977. 有序数组的平方
  7. 【已解决】FileNotFoundError: [Errno 2] No such file or directory:_Python系列学习笔记
  8. 分区供水条件口诀_口诀记忆 | 消防给水和消火栓系统的“月检”(重点学习)...
  9. 挡土墙计算软件_广联达软件如何计算钢板止水带?
  10. java9 反应编程_Java9第四篇-Reactive Stream API响应式编程
  11. 空间参考不存在_空间实景三维信息如何服务于BIM应用
  12. Java中判断当前数据是否全为数字
  13. Asp.Net学习-Cache高速缓存
  14. 进阶之路:深入解读 Java 堆外内存 | 凌云时刻
  15. 分形理论在金相学中的应用
  16. win7录屏_原来电脑自带的录屏功能,那么好用,可惜很多人还不知道,真遗憾...
  17. 13行列式02---余子式与代数余子式、行列式按行(列)展开法则、行列式计算、范德蒙行列式
  18. Sub-center ArcFace
  19. MySQL 怎么插入10天前的日期_Mysql笔记
  20. 客服客户聊天系统源码分享

热门文章

  1. 基于力学分析的系泊系统优化设计-第三题
  2. 入门SVN基础使用教程
  3. ArcMap基本操作
  4. arcgis desktop10.2(arcmap)安装教程,已成功安装
  5. 如何对接GN EDI系统?
  6. 对JSON格式的城市按照拼音首字母排序
  7. HTML:网页设计案例5
  8. bootdo 重命名 版本2.0 (适合所有springboot项目)
  9. 大数据Hadoop详细介绍(v2016)
  10. 多用户远程(RDP Wrapper)安装及使用步骤