ホームページ >バックエンド開発 >C++ >リフレクションを使用して、特定の型のすべての派生型を効率的に見つけるにはどうすればよいですか?

リフレクションを使用して、特定の型のすべての派生型を効率的に見つけるにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-03 18:36:39877ブラウズ

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

型の派生型の検索

多くの場合、特定の型の派生型を決定する必要があります。ただし、読み込まれたアセンブリ内のすべての型を反復処理したり、それらの割り当て可能性を確認したりするなど、既定のアプローチは非効率的になる可能性があります。

Reflection を使用する

よりパフォーマンスの高いソリューションには、次のような方法があります。リフレクションを使用して派生型を取得します。次に、LINQ ベースのアプローチを示します。

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

このメソッドは、すべてのアセンブリを反復処理し、指定された型が各アセンブリ型に割り当て可能かどうかを確認します。

Fluent バージョン

読みやすさを向上させるために、流暢なバージョン:

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

考慮事項

  • リフレクション オーバーヘッド: リフレクション メソッドを呼び出すたびにオーバーヘッドが発生します。反復的な操作の場合は、型を一度ロードし、Lazy などのキャッシュ メカニズムを使用することを検討してください。
  • エクスポートされた型: 公開されている型のみを取得するには、代わりに domainAssembly.GetExportedTypes() を使用することを検討してください。 DomainAssembly.GetTypes().
  • 基本タイプInclusion: デフォルトでは、返されるリストには基本タイプが含まれます。これを除外するには、次の追加条件を使用します: && AssemblyType != typeof(baseType).
  • Abstract Classes: 具象派生クラスのみが必要な場合は、条件: && !assemblyType を追加します。 IsAbstract.
  • ジェネリック型: ジェネリック型の処理には以下が必要です特定のテクニックについては、この回答では取り上げていません。詳細については、提供されているリンクを参照してください。

以上がリフレクションを使用して、特定の型のすべての派生型を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。