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.
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.
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 :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
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, akhirnya
Anda juga bisa mendapatkan jenis tanpa nama yang memenuhi syarat perakitan tetapi dengan nama dll juga, misalnya:
Type myClassType = Type.GetType("TypeName,DllName");
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:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
String kedua setelah koma adalah nama referensi (nama dll).
NamespaceTypeName, AssemblyNameSpec
tempat AssemblyNameSpec
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 (misalnya Version
, Culture
PublicKeyToken
). Untungnya, propertinya opsional .
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
coba gunakan metode ini
public static Type GetType(string typeName)
{
var type = Type.GetType(typeName);
if (type != null) return type;
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
type = a.GetType(typeName);
if (type != null)
return type;
}
return null ;
}
AppDomain
tidak didukung. Tidak yakin ada alternatif.
Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
lock (typeCache) {
if (!typeCache.TryGetValue(typeName, out t)) {
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
t = a.GetType(typeName);
if (t != null)
break;
}
typeCache[typeName] = t; // perhaps null
}
}
return t != null;
}
T
tipe generik dilucuti.
Jika perakitan adalah bagian dari pembuatan aplikasi ASP.NET, Anda bisa menggunakan kelas BuildManager:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
jika kelas Anda tidak ada dalam assambly saat ini Anda harus memberikan kualifikasiNama dan kode ini menunjukkan cara untuk mendapatkan kualifikasinama kelas
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
dan kemudian Anda bisa mendapatkan tipe dengan kualifikasiNama
Type elementType = Type.GetType(qualifiedName);
Jika ini adalah Tipe bersarang, Anda mungkin lupa untuk mengubah a. ke +
Bagaimanapun, typeof( T).FullName
akan memberi tahu Anda apa yang seharusnya Anda katakan
EDIT: 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 ...)
+
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 ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Jadi sekarang kita dapat menggunakan nilai yang dikembalikan dalam strType untuk membuat turunan dari objek itu.
Sebagai Type.GetType (String) membutuhkan Type.AssemblyQualifiedName, Anda harus menggunakan Assembly.CreateQualifiedName (String, String) .
string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);
Versi, Budaya, dan PublicKeyToken tidak diperlukan karena assemblyName
itu Anda dapat menggunakan MyAssembly.GetName (). Name.
Tentang Type.GetType (String) :
Jika jenisnya ada di majelis yang sedang dieksekusi atau di Mscorlib.dll, cukup untuk memberikan nama jenis yang memenuhi syarat oleh namespace-nya.
Jika perakitan direferensikan dan Kelas terlihat:
typeof(namespace.a.b.ClassName)
GetType mengembalikan nol karena jenisnya tidak ditemukan, dengan typeof, kompiler dapat membantu Anda untuk menemukan kesalahan.
Coba gunakan nama tipe lengkap yang menyertakan info rakitan, misalnya:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
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.
Bagi saya, "+" adalah kuncinya! Ini kelas saya (ini kelas bersarang):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
dan baris kode ini berfungsi:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Ini solusi atas tampaknya menjadi yang terbaik untuk saya, tapi itu tidak bekerja untuk saya, jadi saya melakukannya sebagai berikut:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
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 AssemblyQualifiedNames
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.