日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發布時間:2023/12/9 C# 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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、動態創建類型實例并執行其中的方法

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之UGUIUGUIUnity的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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。