Kode ini:
Type.GetType("namespace.a.b.ClassName")
kembali null
.
dan saya miliki dalam usings:
using namespace.a.b;
Memperbarui:
Jenisnya ada, ada di pustaka kelas yang berbeda, dan saya perlu mendapatkannya dengan nama string.
c#
reflection
Omu
sumber
sumber
Jawaban:
Type.GetType("namespace.qualified.TypeName")
hanya berfungsi ketika jenisnya ditemukan di mscorlib.dll atau majelis yang sedang dieksekusi.Jika tidak satu pun dari hal-hal itu benar, Anda memerlukan nama yang memenuhi syarat perakitan :
sumber
Assembly a = Assembly.Load("SomeLibrary");
- dan kemudian memuat jenis berdasarkan nama dari rakitan -Type t = a.GetType("namespace.a.b.ClassName");
.typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
mungkin menyimpan sedikit kerumitan, akhirnyaAnda juga bisa mendapatkan jenis tanpa nama yang memenuhi syarat perakitan tetapi dengan nama dll juga, misalnya:
Saya memiliki situasi yang sama dan itu berhasil untuk saya. Saya membutuhkan objek tipe "DataModel.QueueObject" dan memiliki referensi ke "DataModel" jadi saya mendapatkan tipe sebagai berikut:
String kedua setelah koma adalah nama referensi (nama dll).
sumber
NamespaceTypeName, AssemblyNameSpec
tempatAssemblyNameSpec
pengenal dari rakitan tanpa properti apa pun. Meskipun jawaban ini pada dasarnya sama dengan yang diterima saya berasumsi bahwa beberapa orang lebih suka ini karena tidak jauh dengan beberapa "kebisingan" yang diperkenalkan oleh properti rakitan (misalnyaVersion
,Culture
PublicKeyToken
). Untungnya, propertinya opsional .AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
coba gunakan metode ini
sumber
AppDomain
tidak didukung. Tidak yakin ada alternatif.sumber
T
tipe generik dilucuti.Jika perakitan adalah bagian dari pembuatan aplikasi ASP.NET, Anda bisa menggunakan kelas BuildManager:
sumber
jika kelas Anda tidak ada dalam assambly saat ini Anda harus memberikan kualifikasiNama dan kode ini menunjukkan cara untuk mendapatkan kualifikasinama kelas
dan kemudian Anda bisa mendapatkan tipe dengan kualifikasiNama
sumber
Jika ini adalah Tipe bersarang, Anda mungkin lupa untuk mengubah a. ke +
Bagaimanapun,
typeof( T).FullName
akan memberi tahu Anda apa yang seharusnya Anda katakanEDIT: BTW usings (seperti yang saya yakin Anda tahu) hanya arahan ke kompiler pada waktu kompilasi dan dengan demikian tidak dapat memiliki dampak pada keberhasilan panggilan API. (Jika Anda memiliki referensi proyek atau perakitan, yang berpotensi memiliki pengaruh - maka informasinya tidak berguna, hanya perlu beberapa penyaringan ...)
sumber
+
pemisah)Saya membuka kontrol pengguna tergantung pada apa yang mengontrol pengguna memiliki akses ke ditentukan dalam database. Jadi saya menggunakan metode ini untuk mendapatkan TypeName ...
Jadi sekarang kita dapat menggunakan nilai yang dikembalikan dalam strType untuk membuat turunan dari objek itu.
sumber
Ketika saya hanya memiliki nama kelas, saya menggunakan ini:
sumber
Sebagai Type.GetType (String) membutuhkan Type.AssemblyQualifiedName, Anda harus menggunakan Assembly.CreateQualifiedName (String, String) .
Versi, Budaya, dan PublicKeyToken tidak diperlukan karena
assemblyName
itu Anda dapat menggunakan MyAssembly.GetName (). Name.Tentang Type.GetType (String) :
sumber
Jika perakitan direferensikan dan Kelas terlihat:
GetType mengembalikan nol karena jenisnya tidak ditemukan, dengan typeof, kompiler dapat membantu Anda untuk menemukan kesalahan.
sumber
Coba gunakan nama tipe lengkap yang menyertakan info rakitan, misalnya:
Saya memiliki situasi yang sama ketika saya hanya menggunakan namesspace.classname untuk mendapatkan jenis kelas di majelis yang berbeda dan itu tidak akan berhasil. Hanya berfungsi ketika saya menyertakan info perakitan dalam string tipe saya seperti yang ditunjukkan di atas.
sumber
Pastikan koma tepat setelah nama yang memenuhi syarat
Karena ini tidak akan berhasil
Saya buntung selama beberapa hari untuk hal ini
sumber
Bagi saya, "+" adalah kuncinya! Ini kelas saya (ini kelas bersarang):
dan baris kode ini berfungsi:
sumber
Ini solusi atas tampaknya menjadi yang terbaik untuk saya, tapi itu tidak bekerja untuk saya, jadi saya melakukannya sebagai berikut:
Prasyaratnya adalah Anda mengetahui jalur perakitan. Dalam kasus saya, saya tahu itu karena ini adalah perakitan yang dibangun dari proyek internal lain dan termasuk dalam folder bin proyek kami.
Jika saya menggunakan Visual Studio 2013, target saya .NET adalah 4.0. Ini adalah proyek ASP.NET, jadi saya mendapatkan jalur absolut melalui
HttpContext
. Namun, jalur absolut bukan persyaratan seperti yang terlihat dari MSDN di AssemblyQualifiedNamessumber
Aku curang. Karena tipe yang ingin saya buat (dengan nama) semuanya ada di dalam kontrol I dll, saya hanya meletakkan metode statis di dll dalam rakitan yang mengambil nama sederhana, dan memanggil tipe. Dapatkan tipe dari konteks itu dan mengembalikan hasilnya .
Tujuan aslinya adalah agar tipe dapat ditentukan oleh nama dalam data konfigurasi. Saya telah mengubah kode sehingga pengguna menentukan format untuk diproses. Kelas penangan format mengimplementasikan antarmuka yang menentukan apakah tipe dapat mem-parsing format yang ditentukan. Saya kemudian menggunakan refleksi untuk menemukan tipe yang mengimplementasikan antarmuka, dan menemukan tipe yang menangani format. Jadi sekarang konfigurasi menentukan nama format, bukan tipe tertentu. Kode refleksi dapat melihat dll yang berdekatan dan memuat, mereka jadi saya punya semacam arsitektur plug-in orang miskin.
sumber