Apakah ada cara untuk membuat instance kelas berdasarkan fakta saya tahu nama kelas saat runtime. Pada dasarnya saya akan memiliki nama kelas dalam sebuah string.
Apakah ada cara untuk membuat instance kelas berdasarkan fakta saya tahu nama kelas saat runtime. Pada dasarnya saya akan memiliki nama kelas dalam sebuah string.
Jawaban:
Lihatlah metode Activator.CreateInstance .
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
Cukup sederhana. Asumsikan bahwa nama kelas Anda Car
dan namespace adalah Vehicles
, lalu kirimkan parameter Vehicles.Car
yang mengembalikan objek bertipe Car
. Seperti ini, Anda dapat membuat instance kelas apa pun secara dinamis.
public object GetInstance(string strFullyQualifiedName)
{
Type t = Type.GetType(strFullyQualifiedName);
return Activator.CreateInstance(t);
}
Jika Nama Sepenuhnya Berkualitas Anda (yaitu, Vehicles.Car
dalam hal ini) di majelis lain, itu Type.GetType
akan menjadi nol. Dalam kasus seperti itu, Anda memiliki perulangan melalui semua majelis dan menemukan Type
. Untuk itu Anda bisa menggunakan kode di bawah ini
public object GetInstance(string strFullyQualifiedName)
{
Type type = Type.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
type = asm.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
}
return null;
}
Sekarang jika Anda ingin memanggil konstruktor berparameter lakukan yang berikut ini
Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type
dari pada
Activator.CreateInstance(t);
dynamic
kode - lihat stackoverflow.com/a/2690661/904521 )
strFullyQualifiedName
dengan str
, fullyQualifiedName
akan melakukan pekerjaan.
str
digunakan sebagai bagian dari konvensi penamaan untuk variabel. Organisasi dan proyek tertentu bersikeras untuk mengikuti ini, maka saya gunakan. Jika Anda akan bekerja di oraganisasi / proyek tertentu, Anda akan tahu ini. Seperti yang Anda katakan tanpa str
juga itu akan melakukan pekerjaan :) @MehdiDehghani
Saya berhasil menggunakan metode ini:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
Anda harus melemparkan objek yang dikembalikan ke jenis objek yang Anda inginkan.
Mungkin pertanyaan saya seharusnya lebih spesifik. Saya benar-benar tahu kelas dasar untuk string sehingga diselesaikan dengan:
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
Kelas Activator.CreateInstance memiliki berbagai metode untuk mencapai hal yang sama dengan cara yang berbeda. Saya bisa saja melemparkannya ke objek tetapi di atas adalah yang paling berguna untuk situasi saya.
Saya tahu saya terlambat ke permainan ... tetapi solusi yang Anda cari mungkin kombinasi di atas, dan menggunakan antarmuka untuk menentukan objek Anda aspek yang dapat diakses publik.
Kemudian, jika semua kelas Anda yang akan dihasilkan dengan cara ini mengimplementasikan antarmuka itu, Anda bisa menggunakan tipe antarmuka dan bekerja dengan objek yang dihasilkan.
Untuk membuat instance kelas dari proyek lain dalam solusi, Anda bisa mendapatkan majelis yang ditunjukkan dengan nama kelas apa pun (misalnya BaseEntity) dan membuat instance baru:
var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
Misalnya, jika Anda menyimpan nilai berbagai jenis dalam bidang basis data (disimpan sebagai string) dan memiliki bidang lain dengan nama jenis (yaitu, String, bool, int, MyClass), maka dari data bidang itu, Anda dapat, mungkin, buat kelas jenis apa pun menggunakan kode di atas, dan isi dengan nilai dari bidang pertama. Ini tentu saja tergantung pada jenis yang Anda simpan memiliki metode untuk mengurai string ke jenis yang benar. Saya telah menggunakan ini berkali-kali untuk menyimpan pengaturan preferensi pengguna dalam database.
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
kenapa kamu mau menulis kode seperti ini? Jika Anda memiliki kelas 'ReportClass' tersedia, Anda dapat instantiate langsung seperti yang ditunjukkan di bawah ini.
ReportClass report = new ReportClass();
Kode ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
digunakan ketika Anda tidak memiliki kelas yang diperlukan tersedia, tetapi Anda ingin membuat instance dan atau atau memanggil metode secara dinamis.
Maksud saya ini berguna ketika Anda mengetahui perakitan tetapi saat menulis kode Anda tidak memiliki kelas yang ReportClass
tersedia.