回答:
何かのようなもの:
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
。
IsAssignableFrom
同様に動作するはずです。特に、私のバージョンはインターフェースにも対応しています。私のコードをテストしましたか?私の回答はどのような場合に失敗しますか?
次のメソッドは、型を継承する型のコレクションを取得します。
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の回答を参照してください。
すべてのタイプを列挙し、探しているタイプを継承しているかどうかをチェックする必要があります。
この質問にあるようなコードが役立つ場合があります。
この方法(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();
}