Sesuatu seperti:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}
Jika Anda perlu menangani generik, itu menjadi agak rumit (misalnya meneruskan List<>
tipe terbuka tetapi mengharapkan untuk mendapatkan kembali tipe yang diturunkan dari List<int>
). Kalau tidak, itu sederhana :)
Jika Anda ingin mengecualikan jenis itu sendiri, Anda dapat melakukannya dengan cukup mudah:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => t != baseType &&
baseType.IsAssignableFrom(t));
}
Perhatikan bahwa ini juga akan memungkinkan Anda untuk menentukan antarmuka dan menemukan semua tipe yang mengimplementasikannya, daripada hanya bekerja dengan kelas seperti Type.IsSubclassOf
halnya.
IsAssignableFrom
harus bekerja dengan baik. Secara khusus, versi saya juga menangani antarmuka. Apakah Anda menguji kode saya? Pada kasus apa jawaban saya gagal?Metode berikut akan mendapatkan kumpulan tipe yang mewarisi tipe.
C #
VB.NET
Jika Anda perlu menyertakan tipe yang mengimplementasikan antarmuka, lihat jawaban @Jon Skeet.
sumber
Anda harus menghitung semua jenis dan memeriksa masing-masing apakah itu mewarisi yang Anda cari.
Beberapa kode seperti yang ada di pertanyaan ini semoga bermanfaat untuk Anda.
sumber
Pertimbangkan untuk menggunakan metode ini (ditulis untuk PCL):
sumber