Judulnya agak tidak jelas. Yang ingin saya ketahui adalah apakah ini mungkin:
string typeName = <read type name from somwhere>;
Type myType = Type.GetType(typeName);
MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>();
Jelas, MyGenericClass digambarkan sebagai:
public class MyGenericClass<T>
Saat ini, kompiler mengeluh bahwa 'Tipe atau namespace' myType 'tidak dapat ditemukan. "Harus ada cara untuk melakukan ini.
foo.Method((dynamic)myGenericClass)
untuk menjalankan metode waktu berjalan, secara efektif pola pelokasi layanan untuk metode tipe ini kelebihan beban.public void Method<T>(T obj)
- trik yang saya gunakan lebih dari beberapa kali dalam 6 tahun terakhir sejak komentar itu; pJawaban:
Anda tidak dapat melakukan ini tanpa refleksi. Namun, Anda bisa melakukannya dengan refleksi. Ini contoh lengkapnya:
Catatan: jika kelas generik Anda menerima beberapa jenis, Anda harus menyertakan koma ketika Anda menghilangkan nama-nama jenis, misalnya:
sumber
Sayangnya tidak ada. Argumen umum harus dapat diselesaikan pada waktu kompilasi sebagai 1) tipe yang valid atau 2) parameter generik lainnya. Tidak ada cara untuk membuat instance generik berdasarkan nilai runtime tanpa palu besar menggunakan refleksi.
sumber
Beberapa tambahan cara menjalankan dengan kode gunting. Misalkan Anda memiliki kelas yang mirip dengan
Misalkan saat runtime Anda memiliki FooContent
Jika Anda dapat mengikat pada waktu kompilasi yang Anda inginkan
Namun Anda tidak dapat melakukan ini saat runtime. Untuk melakukan ini saat runtime, Anda harus melakukannya di sepanjang baris:
Untuk memohon secara dinamis
Markdown(IEnumerable<FooContent> contents)
Perhatikan penggunaan
dynamic
dalam pemanggilan metode. Saat runtimedynamicList
akanList<FooContent>
(juga sedangIEnumerable<FooContent>
) karena bahkan penggunaan dinamis masih di-rooting ke bahasa yang sangat diketik, binder waktu berjalan akan memilihMarkdown
metode yang sesuai . Jika tidak ada pencocokan jenis yang tepat, ia akan mencari metode parameter objek dan jika tidak ada yang cocok dengan pengecualian binder runtime akan dimunculkan mengingatkan bahwa tidak ada metode yang cocok.Yang jelas menarik kembali ke pendekatan ini adalah hilangnya besar jenis keselamatan pada waktu kompilasi. Namun demikian, kode di sepanjang garis ini akan memungkinkan Anda beroperasi dalam arti yang sangat dinamis yang pada saat runtime masih diketik sepenuhnya seperti yang Anda harapkan.
sumber
Persyaratan saya sedikit berbeda, tetapi mudah-mudahan akan membantu seseorang. Saya perlu membaca jenis dari konfigurasi dan instantiate jenis generik secara dinamis.
Akhirnya, ini adalah bagaimana Anda menyebutnya. Tentukan jenisnya dengan backtick .
sumber
Jika Anda tahu jenis apa yang akan dilewati, Anda dapat melakukan ini tanpa refleksi. Pernyataan pergantian akan bekerja. Jelas, ini hanya akan bekerja dalam jumlah kasus yang terbatas, tetapi ini akan jauh lebih cepat daripada refleksi.
sumber
Dalam cuplikan ini saya ingin menunjukkan cara membuat dan menggunakan daftar yang dibuat secara dinamis. Misalnya, saya menambahkan ke daftar dinamis di sini.
Demikian pula Anda dapat memanggil metode lain apa pun pada daftar.
sumber