【Unity3D日常开发】Unity3D中 C#反射Reflection的使用
推薦閱讀
- CSDN主頁
- GitHub開源地址
- Unity3D插件分享
- 簡書地址
- 我的個人博客
- QQ群:1040082875
大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時更新Unity開發技巧,覺得有用記得一鍵三連哦。
你的點贊就是對博主的支持,有問題記得留言:
一、前言
今天分享一個平時開發比較少接觸到的概念——反射,最近也是在寫代碼的時候用到了,就分享出來,一方面是對自己學到的知識的總結,另一方面也是為了幫助后來的人。
反射雖然用的不多,但是存在既有道理,在接下來的小節中會講到反射的應用場景。
二、C#反射(Relection)學習
2-1、什么是反射
反射,英文名Relection,是.Net中獲取運行時類型信息的方式,.Net的應用程序由三部分組成:
- 程序集(Assembly)
- 模塊(Module)
- 類型(Class)
而反射提供一些借口,讓程序可以在程序運行時獲得這幾個組件的信息,比如說:
- 獲取正在運行的程序集,根據程序集中的類型信息,創建該類型的實例。
- 獲取對象的類型信息,比如方法、構造器、屬性等。
- 獲取類的方法名稱、參數、返回值等。
總結一句話就是:程序訪問、檢測和修改它本身狀態的一種機制,動態創建實例并執行其中的方法。
2-2、反射的應用場景
說了這么多,反射好像很有用,又好像很沒用的樣子,到底什么地方用到呢?
反射主要在下列情況中很有用:
- 在運行時查看特性信息,訪問程序元數據中的屬性。
- 在運行時查看集合中的類型,并且實例化這些類型。
- 在運行時構建新類型,并且使用這些類型執行一些任務。
- 在運行時綁定、訪問創造類型的方法。
舉個簡單的例子,我們有一個程序play.exe,使用了say.dll和walk.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、動態創建類型實例并執行其中的方法
運行結果:
三、后記
今天分享了什么是反射,以及反射的使用方法。
反射主要是在運行時獲得類型信息的方式,還可以動態創建實例并執行其中的方法。
然后使用了一個簡單實例進行演示如何使用反射,但是反射的用法還有很多,需要讀者自行摸索。
博主還有跟多寶藏文章等待你的發掘哦:
| 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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode: Palindrome
- 下一篇: 从此不再惧怕URI编码:JavaScri