web-dev-qa-db-ja.com

オブジェクトの場合、リフレクションまたは他の方法を使用してすべてのサブクラスを取得できますか?

オブジェクトの場合、リフレクションを使用してすべてのサブクラスを取得できますか?

51
Adam Lee

アセンブリにすべてのタイプをロードしてから列挙し、どのタイプがオブジェクトのタイプを実装しているかを確認できます。あなたは「オブジェクト」と言ったので、以下のコードサンプルはインターフェース用ではありません。また、このコードサンプルは、オブジェクトが宣言された同じアセンブリのみを検索します。

class A
{}
...
typeof(A).Assembly.GetTypes().Where(type => type.IsSubclassOf(typeof(A)));

または、コメントで示唆されているように、このコードサンプルを使用して、ロードされたすべてのアセンブリを検索します。

var subclasses =
from Assembly in AppDomain.CurrentDomain.GetAssemblies()
    from type in Assembly.GetTypes()
    where type.IsSubclassOf(typeof(A))
    select type

両方のコードサンプルでは、​​using System.Linq;を追加する必要があります

72
mtijn

インターフェイスを意味するサブクラス?はい:

this.GetType().GetInterfaces()

基本型を意味するサブクラス?まあ、C#は1つのベースクラスしか持つことができません

サブクラスは、クラスを継承するすべてのクラスを意味しますか?はい:

編集:(ありがとうvcsjones)

foreach(var asm in AppDomain.CurrentDomain.GetAssemblies())
{
        foreach (var type in asm.GetTypes())
        {
            if (type.BaseType == this.GetType())
                yield return type;
        }
}

そして、すべてのロードされたアセンブリに対してそれを行います

9
joe_coolish