Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mendapatkan Semua Jenis Terbitan bagi Jenis Diberi Dengan Cekap Menggunakan Refleksi?

Bagaimanakah Saya Boleh Mendapatkan Semua Jenis Terbitan bagi Jenis Diberi Dengan Cekap Menggunakan Refleksi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-03 18:36:39878semak imbas

How Can I Efficiently Find All Derived Types of a Given Type Using Reflection?

Cari Jenis Terbitan Jenis

Dalam banyak kes, adalah perlu untuk menentukan jenis terbitan bagi jenis tertentu. Walau bagaimanapun, pendekatan lalai, seperti mengulangi semua jenis dalam pemasangan yang dimuatkan dan menyemak kebolehtugasannya, boleh menjadi tidak cekap.

Menggunakan Refleksi

Penyelesaian yang lebih berprestasi melibatkan penggunaan refleksi untuk mendapatkan semula jenis terbitan. Berikut ialah pendekatan berasaskan LINQ:

var listOfDerivedTypes = (
    from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
    from assemblyType in domainAssembly.GetTypes()
    where type.IsAssignableFrom(assemblyType)
    select assemblyType).ToArray();

Kaedah ini berulang melalui semua perhimpunan dan menyemak sama ada jenis yang diberikan boleh diberikan kepada setiap jenis pemasangan.

Versi Fasih

Untuk meningkatkan kebolehbacaan, anda boleh menggunakan fasih versi:

var listOfDerivedTypes = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(domainAssembly => domainAssembly.GetTypes())
    .Where(assemblyType => type.IsAssignableFrom(assemblyType))
    .ToArray();

Pertimbangan

  • Overhed Refleksi: Setiap seruan kaedah refleksi menimbulkan overhed. Untuk operasi berulang, pertimbangkan untuk memuatkan jenis sekali dan menggunakan mekanisme caching, seperti Lazy.
  • Jenis Dieksport: Untuk mendapatkan semula jenis yang boleh dilihat secara umum sahaja, pertimbangkan untuk menggunakan domainAssembly.GetExportedTypes() dan bukannya domainAssembly.GetTypes().
  • Jenis Asas Kemasukan: Secara lalai, senarai yang dikembalikan akan termasuk jenis asas. Untuk mengecualikannya, gunakan syarat tambahan berikut: && assemblyType != typeof(baseType).
  • Kelas Abstrak: Jika anda hanya mahukan kelas terbitan konkrit, tambah syarat: && !assemblyType. IsAbstract.
  • Jenis Generik: Pengendalian jenis generik memerlukan teknik khusus, yang tidak diliputi dalam tindak balas ini. Rujuk pautan yang disediakan untuk maklumat lanjut.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Semua Jenis Terbitan bagi Jenis Diberi Dengan Cekap Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn