C #: Cantumkan Semua Kelas di Majelis

103

Saya ingin mengeluarkan (secara terprogram - C #) daftar semua kelas di majelis saya.

Ada petunjuk atau kode contoh bagaimana melakukan ini? Refleksi?

Alex
sumber
Jika niat Anda adalah untuk memeriksa majelis yang tidak direferensikan oleh proyek Anda, lihat jawaban saya yang diperbarui.
Thorarin

Jawaban:

152

Gunakan Assembly.GetTypes. Sebagai contoh:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}
Jon Skeet
sumber
1
Ada saran untuk majelis besar? Ketika saya menjalankan kode ini untuk perakitan 13,8 MB, instans VS saya hang untuk apa yang terasa seperti tanpa batas. Saya mencoba rakitan 9 KB kecil dan berhasil dengan baik. Saya tahu apa yang Anda pikirkan - mengapa Anda memiliki rakitan 13,8 MB - ini adalah bagian dari lapisan data saya yang dihasilkan menggunakan template NetTeirs. Kami memiliki banyak tabel.
dyslexicanaboko
1
@dyslexicanaboko: Jika Anda memiliki banyak jenis, akan membutuhkan waktu lama untuk menghitung semuanya. Berapa banyak tipe yang ada di rakitan Anda? Dan apa yang kamu lakukan dengan mereka? (Apakah Anda yakin masalahnya adalah dalam mengekstraksi jenisnya, atau hanya apa yang Anda lakukan setelahnya?)
Jon Skeet
Saya tidak bisa melewati panggilan asm.GetTypes (), itu hanya hang - maksud saya ini jelas fakta bahwa ada banyak Jenis - Saya tidak dapat melakukan apa-apa karena itu berusaha keras untuk mencoba mendapatkan semuanya . CPU saya memotret hingga 30% pada salah satu dari 4 core saya. Maksud saya, sebenarnya saya hanya ingin tahu apakah ada cara untuk mengatakan, "Hei - lihat saja di namespace INI" - Saya mendapat kesan bahwa itu tidak mungkin karena metode GetTypes () hanya memiliki konstruktor kosong. Saya mencoba membuat semacam peramban objek.
dyslexicanaboko
1
Poin bagus, saya belum mencobanya. Pekerjaan saya untuk saat ini adalah hanya menargetkan kelas secara langsung menggunakan asm.GetType (fullyQualifiedClassName) - itu berfungsi, tetapi menampilkan daftar kelas kepada pengguna tidak mungkin, itulah yang saya inginkan. Ini bukan klien yang menghadapi btw, saya menggunakannya secara internal untuk diri saya sendiri dan pengembang lain.
dyslexicanaboko
1
@DebugErr: Ya - cukup mudah untuk membuatnya hanya kelas jika Anda mau, tapi tebakan saya adalah bahwa OP mungkin benar - benar menginginkan semua tipe.
Jon Skeet
102

Saya hanya ingin menambahkan contoh Jon. Untuk mendapatkan referensi ke perakitan Anda sendiri, Anda dapat menggunakan:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection namespace.

Jika Anda ingin memeriksa rakitan yang Anda tidak memiliki referensi, Anda dapat menggunakan salah satu dari ini:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

Jika Anda bermaksud untuk membuat contoh tipe Anda setelah Anda menemukannya:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

Lihat dokumentasi kelas Assembly untuk informasi lebih lanjut.

Setelah Anda memiliki referensi ke Assemblyobjek tersebut, Anda dapat menggunakan assembly.GetTypes()seperti yang sudah ditunjukkan Jon.

Thorarin
sumber
Bagaimana saya bisa mereferensikan perakitan yang sama sekali berbeda yang ada dalam solusi saya?
Alex
13
Cara termudah adalah menggunakan typeofdengan tipe yang Anda tahu ada di rakitan itu, dan kemudian Assemblyproperti, seperti dalam contoh saya.
Jon Skeet
2
Jika Anda ingin mereferensikan rakitan, katakanlah abc.dll, yang ada dalam solusi Anda dan jika Anda ok hardcoding nama dll, pendekatan lain untuk merujuk rakitan adalah: `Assembly assembly = Assembly.Load (" abc ");`
Kash
Itu hanya memuat perakitan saat ini. Saya memiliki aplikasi atau exe menggunakan 4 dll atau proyek. Bagaimana saya bisa mendapatkan nama kelas dari dll itu?
Er Mayank
@JonSkeet Bagaimana hal ini dapat dicapai dalam lingkungan c # "modern"? Seperti saat melakukan pengembangan UWP. UWP tidak memiliki metode GetExecutingAssembly ().
Daniel Armstrong