您必須指定類型名稱,以提供對各種反射操作的有效輸入。 完整類型名稱是由元件名稱規格、命名空間規格和類型名稱所組成。 類型名稱規格是由、Type.GetTypeModule.GetType、 ModuleBuilder.GetType和 Assembly.GetType等方法使用。
類型名稱的文法
文法會定義正式語言的語法。 下表列出描述如何辨識有效輸入的語彙規則。 那些無法進一步分解的終端元素會以全部大寫字母顯示。 非終結符號(可進一步被簡化的元素)用混合大小寫或單引號字串來表示,但單引號(')不是語法本身的一部分。 管線符號 (|) 表示具有子規則的規則。
TypeSpec
: ReferenceTypeSpec
| SimpleTypeSpec
;
ReferenceTypeSpec
: SimpleTypeSpec '&'
;
SimpleTypeSpec
: PointerTypeSpec
| GenericTypeSpec
| TypeName
;
GenericTypeSpec
: SimpleTypeSpec ` NUMBER
PointerTypeSpec
: SimpleTypeSpec '*'
;
ArrayTypeSpec
: SimpleTypeSpec '[ReflectionDimension]'
| SimpleTypeSpec '[ReflectionEmitDimension]'
;
ReflectionDimension
: '*'
| ReflectionDimension ',' ReflectionDimension
| NOTOKEN
;
ReflectionEmitDimension
: '*'
| Number '..' Number
| Number '…'
| ReflectionDimension ',' ReflectionDimension
| NOTOKEN
;
Number
: [0-9]+
;
TypeName
: NamespaceTypeName
| NamespaceTypeName ',' AssemblyNameSpec
;
NamespaceTypeName
: NestedTypeName
| NamespaceSpec '.' NestedTypeName
;
NestedTypeName
: IDENTIFIER
| NestedTypeName '+' IDENTIFIER
;
NamespaceSpec
: IDENTIFIER
| NamespaceSpec '.' IDENTIFIER
;
AssemblyNameSpec
: IDENTIFIER
| IDENTIFIER ',' AssemblyProperties
;
AssemblyProperties
: AssemblyProperty
| AssemblyProperties ',' AssemblyProperty
;
AssemblyProperty
: AssemblyPropertyName '=' AssemblyPropertyValue
;
指定特殊字元
在類型名稱中,IDENTIFIER 是由語言規則所決定的任何有效名稱。
使用反斜杠(\)作為轉義字元,當用作IDENTIFIER的一部分時,用來分隔以下標記。
| 代幣 | 意義 |
|---|---|
\, |
組件分隔器。 |
\+ |
巢狀類型分隔符。 |
\& |
參考型別。 |
\* |
指標類型。 |
\[ |
陣組維度分隔符。 |
\] |
陣組維度分隔符。 |
\. |
僅當句點用於陣列規格中時,才在句點前使用反斜杠。 NamespaceSpec 中的句點不會採用反斜杠。 |
\\ |
在作為字串常值時需要使用反斜杠。 |
在 AssemblyNameSpec 以外的所有 TypeSpec 元件中,空格都相關。 在 AssemblyNameSpec 中,''分隔符前面的空格是相關的,但 ',' 分隔符後面的空格會被忽略。
反映類別,例如 Type.FullName,會傳回混淆名稱,讓傳回的名稱可以在呼叫 GetType 中使用,如同 MyType.GetType(myType.FullName) 中一樣。
例如,類型的完整名稱可能是 Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly。
如果命名空間為 Ozzy.Out+Back,則加號前面必須加上反斜杠。 否則,解析器會將它解譯為巢狀分隔符號。 Reflection會將這個字串輸出為 Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly。
指定元件名稱
元件名稱規格中所需的最小資訊是元件的文字名稱 (IDENTIFIER) 。 您可以依照下表所述,以逗號分隔的屬性/值組清單來追蹤IDENTIFIER。 標識元命名應遵循檔案命名的規則。 IDENTIFIER 不區分大小寫。
| 屬性名稱 | 說明 | 允許的值 |
|---|---|---|
| 版本 | 組件版本號碼 | Major.Minor.Build.Revision,其中 Major、 Minor、 Build 和 Revision 是介於 0 到 65535 之間的整數。 |
| PublicKey | 完整公鑰 | 十六進位格式的完整公鑰字串值。 指定 Null 參考 (Visual Basic 中的 Nothing ) 以明確指出私用元件。 |
| PublicKeyToken | 公鑰令牌 (完整公鑰的 8 位元組哈希) | 以十六進位格式表示的公鑰令牌字串值。 指定 Null 參考 (Visual Basic 中的 Nothing ) 以明確指出私用元件。 |
| 文化 | 裝配文化 | RFC-1766 格式的元件文化特性,或與語言無關的元件 (nonsatellite) 元件的「中性」文化特性。 |
| 自定義 | 自定義二進位大型物件 (BLOB)。 這目前只用於 原生映射產生器 (Ngen) 所產生的元件中。 | 自訂字串用於原生映像產生器工具,以通知元件快取所安裝的元件是原生映像,因此會安裝在原生映像快取中。 也稱為 zap 字串。 |
下列範例顯示一個具有預設文化設定的簡單命名組件的 AssemblyName。
com.microsoft.crypto, Culture=""
下列範例顯示如何為強名稱元件指定完整的參考,該元件的文化特性為「en」。
com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
Version=1.0.0.0
下列範例各顯示部分指定的 AssemblyName,可由強元件或單純命名的元件滿足。
com.microsoft.crypto
com.microsoft.crypto, Culture=""
com.microsoft.crypto, Culture=en
下列範例各顯示部分指定的 AssemblyName,這必須由簡單的具名元件滿足。
com.microsoft.crypto, Culture="", PublicKeyToken=null
com.microsoft.crypto, Culture=en, PublicKeyToken=null
下列範例各顯示部分指定之AssemblyName,需要由具有強名稱的元件來滿足。
com.microsoft.crypto, Culture="", PublicKeyToken=a5d015c7d5a0b012
com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
Version=1.0.0.0
指定泛型類型
SimpleTypeSpec'NUMBER 代表具有從 1 到 n 泛型類型參數的開放式泛型類型。 例如,若要取得開放泛型型別 List<T> 或封閉式泛型型別 List<String> 的參考,請使用 Type.GetType("System.Collections.Generic.List`1")。若要取得泛型型別 Dictionary<TKey,TValue> 的參考,請使用 Type.GetType("System.Collections.Generic.Dictionary`2")。
指定指標
SimpleTypeSpec* 代表非受控指標。 例如,若要取得 MyType 類型的指標,請使用 Type.GetType("MyType*")。 若要取得類型 MyType 指標的指標, 請使用 Type.GetType("MyType**")。
指定參考
SimpleTypeSpec& 代表托管指標或參考。 例如,若要取得 MyType 類型的參考,請使用 Type.GetType("MyType &")。 不同於指標,參考限製為一個層級。
指定陣列
在 BNF 文法中,ReflectionEmitDimension 僅適用於使用 ModuleBuilder.GetType擷取的不完整類型定義。 不完整的類型定義是使用 TypeBuilder 建構的物件,但尚未對其呼叫System.Reflection.Emit。 ReflectionDimension 可用來擷取任何已完成的類型定義,也就是已載入的類型。
陣列可藉由指定陣列的排名,在反映中存取陣列:
-
Type.GetType("MyArray[]")取得具有 0 下限的單維度陣列。 -
Type.GetType("MyArray[*]")會取得具有未知下限的單一維度陣列。 -
Type.GetType("MyArray[][]")取得一個二維陣列的數組。 -
Type.GetType("MyArray[*,*]")和Type.GetType("MyArray[,]")會取得具有未知下限的矩形二維陣列。
從運行時間的觀點來看, MyArray[] != MyArray[*]但對於多維度陣列,這兩個表示法是相等的。 也就是說, Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") 評估為 true。
針對 ModuleBuilder.GetType, MyArray[0..5] 表示大小為 6、下限 0 的單一維度陣列。
MyArray[4…] 表示未知大小和下限 4 的單維度陣列。