指定完整的型別名稱
更新:2007 年 11 月
您必須指定型別名稱,以使各種反映作業的輸入有效。完整型別名稱由組件名稱規格、命名空間規格和型別名稱所構成。型別名稱規格用於 Type.GetType、Module.GetType、ModuleBuilder.GetType 和 Assembly.GetType 等方法。
型別名稱的 Backus-Naur 格式文法
Backus-Naur 格式 (BNF) 定義型式語言的語法。以下表格列出 BNF 語彙規則,說明如何辨認有效輸入。終端項 (那些不能再進一步簡化的項目) 全部以大寫字母顯示。非終端項 (那些可繼續簡化的項目) 以大小寫混合或單引號括住的字串來表示,但單引號 (') 不是語法本身的一部分。管道字元 (|) 代表具有子規則的規則。
完整型別名稱的 BNF 文法 |
---|
TypeSpec := ReferenceTypeSpec | SimpleTypeSpec |
ReferenceTypeSpec := SimpleTypeSpec '&' |
SimpleTypeSpec := PointerTypeSpec | ArrayTypeSpec | TypeName |
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 為語言規則決定的任何有效名稱。
使用反斜線 (\) 做為逸出字元 (Escape Character),在當做 IDENTIFIER 一部分使用時,分隔下列語彙基元 (Token)。
語彙基元 |
意義 |
---|---|
\, |
組件分隔符號。 |
\+ |
巢狀型別分隔符號。 |
\& |
參考型別。 |
\* |
指標型別。 |
\[ |
陣列維度分隔符號。 |
\] |
陣列維度分隔符號。 |
\. |
在句號之前使用反斜線,只限句號用於陣列規格內時。NamespaceSpec 中的句號不接受反斜線。 |
\\ |
反斜線,當需要當做字串常值 (String Literal) 時。 |
注意,在所有 TypeSpec 元件中,除了 AssemblyNameSpec 以外,空格是有意義的。在 AssemblyNameSpec 中,',' 分隔符號之前的空格有意義,但 ',' 分隔符號之後的空格則被忽略。
Reflection 類別 (例如 Type.FullName) 會傳回 mangled 名稱,使得該傳回名稱可用於對 GetType 的呼叫,如同在 MyType.GetType(myType.FullName) 中一樣。
例如,型別的完整名稱可能為 Ozzy.OutBack.Kangaroo+Wallaby,MyAssembly。
如果命名空間為 Ozzy.Out+Back,那麼反斜線必須置於加號之前。否則,剖析器 (Parser) 將會解譯它為巢狀分隔符號。反映發出這個字串為 Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly。
指定組件名稱
組件名稱規格中所需最低限度的資訊為組件的文字名稱 (IDENTIFIER)。您可以緊隨 IDENTIFIER 之後加入屬性/值配組的逗號分隔清單,如下表的說明。IDENTIFIER 命名應該遵循檔案命名規則。IDENTIFIER 不區分大小寫。
屬性名稱 |
描述 |
允許值 |
---|---|---|
Version |
組件版本號碼 |
Major.Minor.Build.Revision,其中 Major、Minor、Build 和 Revision 為 0 至包含 65535 之間的整數。 |
PublicKey |
完整公開金鑰 |
十六進位格式的完整公開金鑰字串值。指定 null 參考 (在 Visual Basic 中為 Nothing),以明確指示私用組件。 |
PublicKeyToken |
公開金鑰語彙基元 (完整公開金鑰的 8 位元組雜湊) |
十六進位格式的公開金鑰語彙基元字串值。指定 null 參考 (在 Visual Basic 中為 Nothing),以明確指示私用組件。 |
Culture |
組件文化特性 |
RFC-1766 格式的組件文化特性,或與語言無關 (非附屬) 組件的「中性」。 |
Custom |
自訂二進位大型物件 (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* 代表 Unmanaged 指標。例如,若要取得型別 MyType 的指標,請使用 Type.GetType("MyType*")。若要取得型別 MyType 的指標,請使用 Type.GetType("MyType**")。
指定參考
SimpleTypeSpec & 代表 Managed 指標或參考。例如,若要取得型別 MyType 的參考,請使用 Type.GetType("MyType &")。請注意,與指標不同的是,參考會被限制於一個層級。
指定陣列
在 BNF 文法中,ReflectionEmitDimension 只套用於使用 ModuleBuilder.GetType 所擷取的不完全型別定義。不完全型別定義是指使用 Reflection.Emit 但尚未呼叫 TypeBuilder.CreateType 所建構的 TypeBuilder 物件。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。