Wie erhalten Sie eine Sammlung aller Typen, die von einem bestimmten anderen Typ erben?
Wie erhalten Sie eine Sammlung aller Typen, die von einem bestimmten anderen Typ erben?
Antworten:
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 #
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
Wenn Sie Typen einschließen müssen, die eine Schnittstelle implementieren, lesen Sie die Antwort von @Jon Skeet.
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.
Erwägen Sie die Verwendung dieser Methode (geschrieben für eine 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();
}