Usando la reflexión, ¿es posible descubrir todos los tipos que se derivan de un tipo dado?Descubriendo tipos derivados utilizando la reflexión
Es de suponer que el alcance estaría limitado a un solo conjunto.
Usando la reflexión, ¿es posible descubrir todos los tipos que se derivan de un tipo dado?Descubriendo tipos derivados utilizando la reflexión
Es de suponer que el alcance estaría limitado a un solo conjunto.
más o menos lo mismo que Darin, pero aquí va ..
public static List<Type> FindAllDerivedTypes<T>()
{
return FindAllDerivedTypes<T>(Assembly.GetAssembly(typeof(T)));
}
public static List<Type> FindAllDerivedTypes<T>(Assembly assembly)
{
var derivedType = typeof(T);
return assembly
.GetTypes()
.Where(t =>
t != derivedType &&
derivedType.IsAssignableFrom(t)
).ToList();
}
utilizado como:
var output = FindAllDerivedTypes<System.IO.Stream>();
foreach (var type in output)
{
Console.WriteLine(type.Name);
}
salidas:
NullStream
SyncStream
__ConsoleStream
BufferedStream
FileStream
MemoryStream
UnmanagedMemoryStream
PinnedBufferMemoryStream
UnmanagedMemoryStreamWrapper
IsolatedStorageFileStream
CryptoStream
TailStream
var types = Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof(SomeBaseType).IsAssignableFrom(t) &&
t != typeof(SomeBaseType))
.ToArray();
var derivedTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsSubclassOf(typeof(A))
select t;
Esto vale la pena mencionar esta consulta sólo recupera interfaces o clases que se derivan directamente del tipo 'A'. – ZenLulz
@ZenLulz El nombre ['IsSubclassOf' method] (https://msdn.microsoft.com/en-us/library/system.type.issubclassof.aspx) name es engañoso. En realidad, devuelve 'true' para * clases derivadas *. – HappyNomad
Reescribí @ excelente respuesta de Hath como un método de extensión:
public static class TypeExtensions
{
public static List<Type> GetAllDerivedTypes(this Type type)
{
return Assembly.GetAssembly(type).GetAllDerivedTypes(type);
}
public static List<Type> GetAllDerivedTypes(this Assembly assembly, Type type)
{
return assembly
.GetTypes()
.Where(t => t != type && type.IsAssignableFrom(t))
.ToList();
}
}
Uso:
var listOfDerived = typeof(MyClass).GetAllDerivedTypes();
Por qué usar ['IsAssignableFrom'] (https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx) en lugar de [' IsSubclassOf'] (https://msdn.microsoft.com /en-us/library/system.type.issubclassof.aspx)? ¿Tal vez quieres soportar interfaces? Pero ese resultado incluirá implementar clases. – HappyNomad
@HappyNomad Usted hace un excelente punto. En mi caso, quería dar soporte a las interfaces. –
Mi [respuesta] (http://stackoverflow.com/a/40238277) para una pregunta duplicada admite interfaces. – HappyNomad
Supongo que está utilizando 'IsAssignableFrom' en lugar de' IsSubclassOf' para tener en cuenta las interfaces. Pero invocarlo en una interfaz también devuelve sus clases de implementación. – HappyNomad