Bagikan melalui


Tentukan nama tipe berkwalifikasi lengkap

Anda harus menentukan nama tipe untuk memiliki input yang valid untuk berbagai operasi refleksi. Nama tipe yang sepenuhnya memenuhi syarat terdiri dari spesifikasi nama rakitan, spesifikasi namespace, dan nama tipe. Spesifikasi nama jenis digunakan oleh metode seperti Type.GetType, , Module.GetTypeModuleBuilder.GetType, dan Assembly.GetType.

Tata bahasa untuk nama jenis

Tata bahasa mendefinisikan sintaks bahasa formal. Tabel berikut ini mencantumkan aturan leksikal yang menjelaskan cara mengenali input yang valid. Terminal-terminal (elemen-elemen yang tidak dapat diuraikan lebih lanjut) ditampilkan dalam semua huruf besar. Nonterminal (elemen yang lebih dapat direduksi) ditampilkan dalam string dengan huruf campuran atau string yang dikutip dengan tanda kutip tunggal, tetapi tanda kutip tunggal (') bukan bagian dari sintaks itu sendiri. Karakter pipa (|) menunjukkan aturan yang memiliki subaturan.

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
	;

Tentukan karakter khusus

Dalam nama jenis, IDENTIFIER adalah nama valid yang ditentukan oleh aturan suatu bahasa.

Gunakan garis miring terbalik (\) sebagai karakter escape untuk memisahkan token berikut saat digunakan sebagai bagian dari IDENTIFIER.

Tanda Makna
\, Pemisah rakitan.
\+ Pemisah tipe bersarang.
\& Jenis referensi.
\* Jenis penunjuk.
\[ Pemisah dimensi array.
\] Pemisah dimensi array.
\. Gunakan backslash sebelum titik hanya jika titik digunakan dalam spesifikasi array. Periode di NamespaceSpec tidak mengambil garis miring terbelakang.
\\ Garis miring terbalik saat diperlukan sebagai string harfiah.

Di semua komponen TypeSpec kecuali AssemblyNameSpec, spasi relevan. Di AssemblyNameSpec, spasi sebelum pemisah ',' relevan, tetapi spasi setelah pemisah ',' diabaikan.

Kelas refleksi, seperti Type.FullName, mengembalikan nama yang diacak sehingga nama yang dikembalikan dapat digunakan dalam pemanggilan ke GetType, seperti pada MyType.GetType(myType.FullName).

Misalnya, nama yang diberi kualifikasi penuh untuk tipe mungkinOzzy.OutBack.Kangaroo+Wallaby,MyAssembly.

Jika namespace adalah Ozzy.Out+Back, maka tanda plus harus didahului oleh tanda garis miring terbalik. Jika tidak, parser akan menafsirkannya sebagai pemisah bersarang. Pantulan memancarkan string ini sebagai Ozzy.Out\+Back.Kangaroo+Wallaby,MyAssembly.

Tentukan nama rakitan

Informasi minimum yang diperlukan dalam spesifikasi nama rakitan adalah nama tekstual (PENGIDENTIFIKASI) dari rakitan. Anda dapat mengikuti PENGIDENTIFIKASI dengan daftar pasangan properti/nilai yang dipisahkan koma seperti yang dijelaskan dalam tabel berikut. Penamaan pengidentifikasi harus mengikuti aturan untuk penamaan file. Pengidentifikasi tidak membedakan huruf besar-kecil.

Nama properti Deskripsi Nilai yang diizinkan
Versi Nomor versi rakitan Major.Minor.Build.Revisi, di mana Mayor, Minor, Build, dan Revisi adalah bilangan bulat antara 0 dan 65535 inklusif.
PublicKey Kunci publik penuh Nilai string kunci publik penuh dalam format heksadesimal. Tentukan referensi null (Tidak ada di Visual Basic) untuk secara eksplisit menunjukkan rakitan privat.
PublicKeyToken Token kunci publik (hash 8 byte dari kunci publik lengkap) Nilai string token kunci publik dalam format heksadesimal. Tentukan referensi null (Tidak ada di Visual Basic) untuk secara eksplisit menunjukkan rakitan privat.
Budaya Budaya kolaborasi Budaya perakitan dalam format RFC-1766, atau "netral" untuk rakitan independen bahasa (nonsatellite).
Khusus Objek besar biner khusus (BLOB). Ini saat ini hanya digunakan dalam rakitan yang dihasilkan oleh Native Image Generator (Ngen). String kustom yang digunakan oleh alat Native Image Generator untuk memberi tahu cache asembli bahwa asembli yang dipasang adalah citra asli, sehingga akan diinstal dalam cache citra asli. Juga disebut string zap.

Contoh berikut menunjukkan AssemblyName untuk rakitan bernama sederhana dengan budaya default.

com.microsoft.crypto, Culture=""

Contoh berikut menunjukkan referensi yang sepenuhnya ditentukan untuk rakitan bernama kuat dengan budaya "en".

com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
    Version=1.0.0.0

Contoh berikut masing-masing menunjukkan AssemblyName yang ditentukan sebagian, yang dapat dipenuhi oleh assembly yang bernama kuat atau bernama sederhana.

com.microsoft.crypto
com.microsoft.crypto, Culture=""
com.microsoft.crypto, Culture=en

Contoh berikut masing-masing menunjukkan AssemblyName yang ditentukan sebagian, yang harus dipenuhi oleh assembly dengan nama sederhana.

com.microsoft.crypto, Culture="", PublicKeyToken=null
com.microsoft.crypto, Culture=en, PublicKeyToken=null

Contoh berikut masing-masing menunjukkan AssemblyName yang ditentukan sebagian, yang harus dipenuhi oleh assembly bernama kuat.

com.microsoft.crypto, Culture="", PublicKeyToken=a5d015c7d5a0b012
com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012,
    Version=1.0.0.0

Tentukan jenis generik

SimpleTypeSpec'NUMBER mewakili tipe generik terbuka dengan parameter tipe generik dari 1 hingga n. Misalnya, untuk mendapatkan referensi ke jenis generik terbuka List<T> atau jenis generik tertutup List<String>, gunakan Type.GetType("System.Collections.Generic.List`1"). Untuk mendapatkan referensi ke jenis generik Dictionary<TKey,TValue>, gunakan Type.GetType("System.Collections.Generic.Dictionary`2").

Tentukan penunjuk

SimpleTypeSpec* mewakili penunjuk yang tidak dikelola. Misalnya, untuk mendapatkan pointer untuk mengetik MyType, gunakan Type.GetType("MyType*"). Untuk mendapatkan pointer ke pointer pada tipe MyType, gunakan Type.GetType("MyType**").

Tentukan referensi

SimpleTypeSpec & mewakili pointer atau referensi terkelola. Misalnya, untuk mendapatkan referensi untuk mengetik MyType, gunakan Type.GetType("MyType &"). Tidak seperti pointer, referensi terbatas pada satu tingkat.

Spesifikasikan array

Dalam Tata Bahasa BNF, ReflectionEmitDimension hanya berlaku untuk definisi jenis yang tidak lengkap yang diambil menggunakan ModuleBuilder.GetType. Definisi jenis yang tidak lengkap adalah objek yang TypeBuilder dibangun menggunakan System.Reflection.Emit tetapi di mana TypeBuilder.CreateType belum dipanggil. ReflectionDimension dapat digunakan untuk mengambil definisi tipe apa pun yang telah selesai, yaitu tipe yang telah dimuat.

Array diakses dalam pantulan dengan menentukan peringkat array:

  • Type.GetType("MyArray[]") mendapatkan array berdimensi tunggal dengan batas bawah 0.
  • Type.GetType("MyArray[*]") mendapatkan array dimensi tunggal dengan batas bawah yang belum diketahui.
  • Type.GetType("MyArray[][]") mendapatkan array dari array dua dimensi.
  • Type.GetType("MyArray[*,*]") dan Type.GetType("MyArray[,]") mendapatkan array dua dimensi persegi panjang dengan batas bawah yang tidak diketahui.

Dari sudut pandang runtime, MyArray[] != MyArray[*], tetapi untuk array multidimensi, dua notasi tersebut setara. Artinya, Type.GetType("MyArray [,]") == Type.GetType("MyArray[*,*]") dievaluasi menjadi benar.

Untuk ModuleBuilder.GetType, MyArray[0..5] menunjukkan array dimensi tunggal dengan ukuran 6, batas bawah 0. MyArray[4…] menunjukkan array dimensi tunggal dengan ukuran yang tidak diketahui dan memiliki batas bawah 4.

Lihat juga