簡單說就是一個可以獲得類型相關資訊的類型。例如類型名稱、所屬的命名空間等的資訊外,也包含該類型是否公開、是否私人等等修飾內容,以及該類別是否為類別類型、介面類型、陣列類型等等,最後當然也可以存取該類型的成員內容。
可以透過兩種方式產生 Type 類型。
因為 Object 包含 GetType 方法,所以所有類型都包含這個方法。
透過 typeof 關鍵字來取得 Type 類型。
var stringType = "Mio".GetType ();
var stringType2 = typeof (string);
var isEquals = stringType == stringType2;
可以看到兩個是一樣的型別 System.String
。
這邊簡單的舉例類型的名稱、類型的存取範圍,基底類型是什麼。
var stringType = "Mio".GetType ();
Console.WriteLine ($"Name = {stringType.Name}, IsPublic = {stringType.IsPublic}, BaseType = {stringType.BaseType}");
還有很多很多內容,就請自己點點看。
static void Main (string[] args) {
var memberType = typeof (Member);
var memberMembers = memberType.GetMembers ();
var memberPropertys = memberType.GetProperties ();
var memberMethods = memberType.GetMethods ();
}
class Member {
public int ID { get; set; }
public string Name { get; set; }
public string Phone;
public void Print () { }
}
透過上述的三種方法可以存取成員、屬性以及方法,這邊有地方我不是很清楚,可能不小心誤導到其他人了,GetProperties 是傳回目前 Type 的所有公用屬性,而我在 DAY 21 的時候提到了 get & set 存取子時,說到若不添加存取子,則視為 get & set,但經由這次範例發現並不是這樣,沒有撰寫存取子的 Phone 並不屬於公用屬性,我很抱歉我觀念錯了,如果有大大能為我解答,還請麻煩了。
Type 類型可以幫助我們檢查類型,獲得類型的相關資訊等,但我覺得最常使用的地方是比較類型,與可以在編譯時期動態操作類型,後者會在明天簡單的提到,也因為本人的工作內容並不需要用到很多的反射操作,所以也只會簡單的使用,只是讓你哪天需要操作類型時,在腦海裡想到有這種類型。
然後其實我們在 DAY 15 的時候,就有使用過此類型來檢查類型是否一樣,但當初沒有想到會來介紹這類型,所以也沒說之後會提或補充。但今天本來想介紹反射,但介紹反射前,我覺得需要先認識 Type,不然反射一堆 Type 的操作卻不先介紹 Type 有點奇怪。
感謝閱讀。
參考連結
Type Class (System) | Microsoft Docs
typeof (C# 參考) | Microsoft Docs