Etwas wie:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}
Wenn Sie mit Generika umgehen müssen, wird dies etwas schwieriger (z. B. Übergabe des offenen List<>
Typs, aber Erwartung, einen Typ zurückzugewinnen, der von abgeleitet ist List<int>
). Ansonsten ist es aber einfach :)
Wenn Sie den Typ selbst ausschließen möchten, können Sie dies ganz einfach tun:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => t != baseType &&
baseType.IsAssignableFrom(t));
}
Beachten Sie, dass Sie auf diese Weise auch eine Schnittstelle angeben und alle Typen finden können, die sie implementieren, anstatt wie bisher nur mit Klassen zu arbeiten Type.IsSubclassOf
.
IsAssignableFrom
sollte auch funktionieren. Insbesondere kommt meine Version auch mit Schnittstellen zurecht. Hast du meinen Code getestet? In welchem Fall schlägt meine Antwort fehl?Die folgende Methode ruft eine Sammlung von Typen ab, die einen Typ erben.
C #
VB.NET
Wenn Sie Typen einschließen müssen, die eine Schnittstelle implementieren, lesen Sie die Antwort von @Jon Skeet.
quelle
Sie müssen alle Typen auflisten und für jeden prüfen, ob er den gesuchten erbt.
Ein Code wie der in dieser Frage kann für Sie nützlich sein.
quelle
Erwägen Sie die Verwendung dieser Methode (geschrieben für eine PCL):
quelle