首頁 > 後端開發 > C++ > 如何使用反射有效地找到給定類型的所有派生類型?

如何使用反射有效地找到給定類型的所有派生類型?

Mary-Kate Olsen
發布: 2025-01-03 18:36:39
原創
874 人瀏覽過

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

尋找類型的衍生類型

在許多情況下,有必要確定給定類型的衍生類型。但是,預設方法(例如迭代載入的程式集中的所有類型並檢查其可分配性)可能效率低下。

使用反射

更有效率的解決方案涉及使用反射來檢索派生類型。這是一種基於 LINQ 的方法:

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

此方法迭代所有程序集並檢查給定類型是否可指派給每個組件類型。

Fluent 版本

為了提高可讀性,您可以使用Fluent版本:

var listOfDerivedTypes = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(domainAssembly => domainAssembly.GetTypes())
    .Where(assemblyType => type.IsAssignableFrom(assemblyType))
    .ToArray();
登入後複製

注意事項

  • 反射開銷:每次呼叫反射方法都會產生開銷。對於重複操作,請考慮載入類型一次並使用快取機制,例如 Lazy。
  • 匯出類型: 若要只擷取公開可見的類型,請考慮使用domainAssembly.GetExportedTypes() 而非domainAssembly.GetTypes().
  • 基本類型包含:
  • 預設情況下,傳回的清單將包含基本類型。要排除它,請使用以下附加條件: && assemblyType != typeof(baseType).
  • 抽象類別:
  • 如果您只需要具體的衍生類,請新增條件:&& ! assemblyType 。 IsAbstract.
  • 泛型類型:
  • 處理泛型類型需要特定的技術,這不在本次回覆中。請參閱提供的連結以獲取更多資訊。

以上是如何使用反射有效地找到給定類型的所有派生類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板