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.
c#
.net
instantiation
system.type
PeteT
sumber
sumber
Jawaban:
Lihatlah metode Activator.CreateInstance .
sumber
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
Cukup sederhana. Asumsikan bahwa nama kelas Anda
Car
dan namespace adalahVehicles
, lalu kirimkan parameterVehicles.Car
yang mengembalikan objek bertipeCar
. Seperti ini, Anda dapat membuat instance kelas apa pun secara dinamis.Jika Nama Sepenuhnya Berkualitas Anda (yaitu,
Vehicles.Car
dalam hal ini) di majelis lain, ituType.GetType
akan menjadi nol. Dalam kasus seperti itu, Anda memiliki perulangan melalui semua majelis dan menemukanType
. Untuk itu Anda bisa menggunakan kode di bawah iniSekarang jika Anda ingin memanggil konstruktor berparameter lakukan yang berikut ini
dari pada
sumber
dynamic
kode - lihat stackoverflow.com/a/2690661/904521 )strFullyQualifiedName
denganstr
,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 tanpastr
juga itu akan melakukan pekerjaan :) @MehdiDehghaniSaya berhasil menggunakan metode ini:
Anda harus melemparkan objek yang dikembalikan ke jenis objek yang Anda inginkan.
sumber
Mungkin pertanyaan saya seharusnya lebih spesifik. Saya benar-benar tahu kelas dasar untuk string sehingga diselesaikan dengan:
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.
sumber
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.
sumber
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:
sumber
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.
sumber
kenapa kamu mau menulis kode seperti ini? Jika Anda memiliki kelas 'ReportClass' tersedia, Anda dapat instantiate langsung seperti yang ditunjukkan di bawah ini.
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.sumber