讀書筆記 C# Type類型與泛型有關的某些屬性淺析


IsGenericType 如果類型為泛型,則返回 true。
GetGenericArguments

返回 Type 對象數組,這些對象表示為構造類型提供的類型變量,或泛型類型定義的類型參數。
如果是MyList<int,Person> ,則返回int和Person類型的數組,如同Type[] tpyes={typeof(int),typeof(Person)},Type數組中任一參數的IsGenericParameter為false;
如果是MyList<,>或,則返回T和U類型的數組,這時得到的Type數組中的任一參數的IsGenericParameter屬性為true,因為MyList<T,U>是泛型類型的初始定義

GetGenericTypeDefinition

返回當前構造類型的基礎泛型類型定義。
返回一個基礎定義的Type,如MyList<T,U>,可以用來構造其他泛型類型定義。
Type t = typeof(Stack<>);
//獲取基礎泛型類型定義,即Stack<T>,這時可用defType定義其他的泛型類型,比如Stack<Person>
Type defType = t.GetGenericTypeDefinition();

if(defType.IsGenericTypeDefinition) {
Type dType = defType.MakeGenericType(typeof(Person));
Console.WriteLine(dType.IsGenericTypeDefinition);
}

GetGenericParameterConstraints

如果泛型類型的類型參數T有參數約束,且這些約束參數是自定義的類型(如Person)或其他可以用來實例化對象的類型,不是class、struct等關鍵字的話,則可用該方法獲取這些參數約束的類型。該方法會返回一個Type數組。
如:
//這個會返回Type[] type={typeof(Person)}
public class Stack<T> where T:Person {}

//這個返回的Type數組的length為0
public class Stack<t> where T:class{}

ContainsGenericParameters

如果類型或其任意封閉類型或方法包含沒有被提供特定類型的類型參數,則返回 true。
即:
//提供了特定類型參數Person
Type t = typeof(Stack<Person>);
//返回false
Console.WriteLine(t.ContainsGenericParameters);

//沒有提供特定類型參數
Type t = typeof(Stack<>);
//返回true
Console.WriteLine(t.ContainsGenericParameters);

GenericParameterAttributes 獲取 GenericParameterAttributes 標志的組合,這些標志描述當前泛型類型參數的特殊約束。如class、new()等
GenericParameterPosition

對於表示類型參數的 Type 對象,獲取類型參數在聲明該類型參數的泛型類型定義或泛型方法定義的類型參數列表中的位置。
如果IsGenericParameter為false,表明用於typeof的Stack泛型的類型參數是特定的,不是原生的T,這時不能使用GenericParameterPosition屬性,會拋出異常;如果IsGenericParameter為true,才能使用GenericParameterPosition屬性。
//首先通過GetGenericArguments方法獲取,如:
Type t = typeof(Stack<>);
Type[] types = t.GetGenericArguments();
//其次可用foreach循環。如果是typeof(Stack<Person>)這種情況,t1.IsGenericParameter會為false,這時不能使用t1.GenericParameterPosition屬性,否則會拋出異常。
foreach(Type t1 in types) {
Console.WriteLine(t1.Name + " " + t1.IsGenericParameter + " "+t1.GenericParameterPosition);
}

IsGenericParameter

獲取一個值,該值指示當前 Type 是表示泛型類型定義的類型參數,還是泛型方法定義的類型參數。
如果typeof的是原生的泛型類(例如Type type=typeof(Stack<>);),則IsGenericParameter為true,否則為false

IsGenericTypeDefinition

獲取一個值,該值指示當前 Type 是否表示可以用來構造其他泛型類型的泛型類型定義。 如果類型表示泛型類型的定義,則返回 true。
我的理解是,是否為原生的泛型類型定義,即是否為這樣的形式定義的Type:
Type type=typeof(Stack<>);
如果是,則返回true,否則返回false。因為定義的type,才是原生的泛型類型,才能通過以下代碼去定義特定類型的泛型類:
if(type.IsGenericTypeDefinition) {
//dType如同Type dtype=typeof(Stack<Person>);
Type dType = type.MakeGenericType(typeof(Person));
}

DeclaringMethod 返回定義當前泛型類型參數的泛型方法;如果類型參數不是由泛型方法定義的,則返回空值。
MakeGenericType 用類型數組的元素替代當前泛型類型定義的類型參數,並返回表示結果構造類型的 Type 對象。

   

發現一個有趣的現象,如果屬性中包含Generic字眼的,多數都是指明Type為typeof的原生泛型類,及Type type=typeof(Stack<>);這種形式,原生的也稱為基礎的泛型類型可以用來定義特定類型的其他泛型類,即用可以實例化對象的類型將T替換掉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM