特定のタイプC#から継承するアセンブリ内のすべてのタイプを見つける方法


92

特定の他のタイプから継承するすべてのタイプのコレクションをどのように取得しますか?

回答:


150

何かのようなもの:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
    return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}

ジェネリックスを処理する必要がある場合、それは少しトリッキーになります(たとえば、オープンList<>タイプを渡すが、から派生したタイプを返すことを期待しているList<int>)。そうでなければそれは簡単です:)

タイプ自体を除外する場合は、十分簡単に​​行うことができます。

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
    return assembly.GetTypes().Where(t => t != baseType && 
                                          baseType.IsAssignableFrom(t));
}

これにより、インターフェイスを指定して、それを実装するすべての型を見つけることができるようになることに注意してくださいType.IsSubclassOf


2
ありがとう!私はこの感謝を使用することになりました-私はこのパブリック静的List <Type> GetAllSubclassesOf(Type baseType){return Assembly.GetAssembly(baseType).GetTypes()を使用することになりました。Where(type => type.IsSubclassOf(baseType))。ToList(); }
aceinthehole 2009

@Downvoterこちら。コメントがありませんでした。aceintheholeで示されているように、答えは正しくありません。コードが機能しないことが判明するまで、エースのコメントを逃したので、正解を追加しました。メリークリスマス。
Tim Murphy、

@ティム:それは不正確ではなく、わずかに異なります。IsAssignableFrom同様に動作するはずです。特に、私のバージョンはインターフェースにも対応しています。私のコードをテストしましたか?私の回答はどのような場合に失敗しますか?
Jon Skeet、2010

1
@ジョン。あなたのメソッドがインターフェースを処理するのはかなり正しいことです。私はVBプログラマーです。クラスを継承し、インターフェイスを実装します。これはC#で異なりますか?質問は、私が要求したように、型を実装するのではなく、型を継承する型を望んでいるためです。
Tim Murphy

2
@Tim:C#では両方に ":"を使用しますが、通常、インターフェイスを型の継承階層の一部と見なします。
Jon Skeet、2010

27

次のメソッドは、型を継承する型のコレクションを取得します。

C#

public IEnumerable<Type> FindSubClassesOf<TBaseType>()
{   
    var baseType = typeof(TBaseType);
    var assembly = baseType.Assembly;

    return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
}

VB.NET

Public Function FindSubClasses(Of TBaseType)() As IEnumerable(Of Type)

    Dim baseType = GetType(TBaseType)
    Dim assembly = baseType.Assembly

    Return From t In assembly.GetTypes() 
           Where t.IsSubClassOf(baseType) 
           Select t

End Function

インターフェースを実装するタイプを含める必要がある場合は、@ Jon Skeetの回答を参照してください。



1

この方法(PCL用に作成)の使用を検討してください。

public IEnumerable<Type> FindDerivedTypes( Assembly assembly, Type baseType )
{
        TypeInfo baseTypeInfo = baseType.GetTypeInfo();
        bool isClass = baseTypeInfo.IsClass, isInterface = baseTypeInfo.IsInterface;

        return
            from type in assembly.DefinedTypes
            where isClass ? type.IsSubclassOf( baseType ) :
                  isInterface ? type.ImplementedInterfaces.Contains( baseTypeInfo.AsType() ) : false
            select type.AsType();
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.