C#中的反射和特性(一)
前言:
前段時間將Unity3d中UGUI組件精簡復盤落下了帷幕,后期博主可能會從設計模式,部分的演算法,以及從UGUI實際操作上、或者從Unity3D部分的一些小游戲Demo上去做文章,但是在此之前,還是多多了解和使用使用C#吧,這就是我之前提到了框架,lua的框架在便捷的同時,也會增加一個人的編程語言的惰性,雖然不是不懂,但是久而久之,使用少了,也就沒有那么熟練了,所以近期可能會更多的從C#或者Unity的相關小型Demo的講解入手去練習與講解,
話不多說,我們直接進入正題~ 今天我們講的就是C#中的反射和特性(一)啦~
1.什么是元資料,什么是反射
程式是用來處理資料的,文本和特性都是資料,而我們程式本身(類的定義和BLC中的類)這些也是資料,
有關程式及其型別的資料被稱為元資料(metadata),它們保存在程式的程式集中,
程式在運行時,可以查看其它程式集或其本身的元資料,一個運行的程式查看本身的元資料或者其他程式集的元資料的行為叫做反射,
2.Type類
預定義型別(int long 和string等),BCL中的型別(Console,IEnumerable等)和程式員自定義型別(MyClass,MyDel等), 每種型別都有自己的成員和特性,
BCL宣告了一個叫做Type的抽象類,它被設計用來包含型別的特性,使用這個類的物件能讓我們獲取程式使用的型別的資訊,
由于 Type是抽象類,因此不能利用它去實體化物件,關于Type的重要事項如下:
對于程式中用到的每一個型別,CLR都會創建一個包含這個型別資訊的Type型別的物件,
程式中用到的每一個型別都會關聯到獨立的Type類的物件,
不管創建的型別有多少個示例,只有一個Type物件會關聯到所有這些實體
3.System.Type類部分成員
成員 成員型別 描述
Name 屬性 回傳型別的名字
Namespace 屬性 回傳包含型別宣告的命名空間
Assembly 屬性 回傳宣告型別的程式集,
GetFields 方法 回傳型別的欄位串列
GetProperties 方法 回傳型別的屬性串列
GetMethods 方法 回傳型別的方法串列
那就舉個例子吧:
我們定義一個Myclass類,并且定義好相關的欄位,屬性以及方法,我們就通過反射的原理來了解他們實際上代表的意義吧
Myclass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test_Reflection_and_characteristic
{
public class Myclass
{
private int id;
private int age;
public int height;
public int weight;
private string Sex { get; set; }
public string Name { get; set; }
public void Test()
{
}
public void Test2()
{
}
private void Test3()
{
}
}
}
在主程式中我們通過反射的關系去拿到這個Myclass類的相關資訊
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Test_Reflection_and_characteristic
{
class Program
{
static void Main(string[] args)
{
Myclass my = new Myclass();//每一個類對應一個type物件,這個type物件存盤了這個類,有哪些方法跟哪些方法以及哪些成員
Type testType = my.GetType();//一個類中的資料是存盤在物件中的,但是type物件只存盤類的成員
Console.WriteLine("輸出 testType所參考的命名空間:{0}", testType);
Console.WriteLine("獲取當前testType所參考的類名:{0}", testType.Name);
Console.WriteLine("輸出當前tesType中的程式集:{0}", testType.Assembly);
Console.WriteLine("輸出與當前testType相關聯的屬性:{0}", testType.Attributes);
}
}
}
輸出結果:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nsbsQdBW-1631380047788)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210912001209264.png)]](https://img.uj5u.com/2021/09/13/264265131208071.png)
我想通過這種方式輸出表達出來已經足夠明確了吧
同時當我們想要通過反射去訪問到類里面的類的欄位、屬性與方法也是可以的
在主程式中補充代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Test_Reflection_and_characteristic
{
class Program
{
static void Main(string[] args)
{
Myclass my = new Myclass();//每一個類對應一個type物件,這個type物件存盤了這個類,有哪些方法跟哪些方法以及哪些成員
Type testType = my.GetType();//一個類中的資料是存盤在物件中的,但是type物件只存盤類的成員
Console.WriteLine("輸出 testType所參考的命名空間:{0}", testType);
Console.WriteLine("獲取當前testType所參考的類名:{0}", testType.Name);
Console.WriteLine("輸出當前tesType中的程式集:{0}", testType.Assembly);
Console.WriteLine("輸出與當前testType相關聯的屬性:{0}", testType.Attributes);
//通過FieldInfo去訪問欄位
FieldInfo[] array = testType.GetFields();
foreach (FieldInfo info in array)
{
//注意只有public公有的欄位才能訪問到,private私有欄位是無法訪問到的
Console.WriteLine("輸出當前testType中所含有的欄位{0}", info.Name);
}
PropertyInfo[] array2 = testType.GetProperties();
foreach (PropertyInfo info in array2)
{
//注意只有public公有的屬性才能訪問到,private私有屬性是無法訪問到的
Console.WriteLine("輸出當前testType中所含有的屬性{0}", info.Name);
}
MethodInfo[] array3 = testType.GetMethods();
foreach (MethodInfo info in array3)
{
//注意只有public公有的方法才能訪問到,private私有方法是無法訪問到的
Console.WriteLine("輸出當前testType中所含有的方法{0}", info.Name);
}
}
}
}
編譯結果:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-K3vWB84g-1631380047797)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210912001412768.png)]](https://img.uj5u.com/2021/09/13/264265131208075.png)
注意:無論是類的欄位和屬性以及方法,都是只能訪問到public權限下的成員與資料,后面的Equals方法,GetHashCode以及GetType、Tostring方法是Type類里面自己重寫的,想要了解的話,直接找到主程式中的Type,按下F12鍵就知道啦
如圖所示:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VMm4njtY-1631380047803)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210912003544846.png)]](https://img.uj5u.com/2021/09/13/264265131208076.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eRsOcT7y-1631380047806)(D:\CSDN博客博文\CSDN表情包\CD136E8F825E7814554E99D9869E27D0.jpg)]](https://img.uj5u.com/2021/09/13/264265131208077.png)

“哥哥”的快樂你是體會不到的!自己可以慢慢按F12去體會其中的快樂奧,哥哥累了,哥哥要休息一小會兒…,

如果博客博友對這個章節有更多的內容想要了解的,可以評論哈,等這一個章節結束后,我會根據評論反饋以及自己的能力,將評論中反饋的內容在下一個計劃中去制作出對應的內容的哈~
作者:ProMer_Wang
鏈接:https://blog.csdn.net/qq_43801020/article/details/120245915
本文為ProMer_Wang的原創文章,著作權歸作者所有,轉載請注明原文出處,歡迎轉載!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299762.html
標籤:其他
