Come si ottiene una raccolta di tutti i tipi che ereditano da un altro tipo specifico?Come trovare tutti i tipi in un assieme che eredita da un tipo specifico C#
risposta
Qualcosa di simile:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}
Se è necessario gestire farmaci generici, che diventa un po 'più complicato (per esempio passando nella List<>
tipo aperto, ma in attesa di tornare un tipo che deriva da List<int>
). Altrimenti è semplice però :)
Se si desidera escludere il tipo di per sé, si può farlo abbastanza facilmente:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => t != baseType &&
baseType.IsAssignableFrom(t));
}
Si noti che questo permetterà anche di specificare un'interfaccia e trovare tutti i tipi, che implementarlo, piuttosto che lavorare solo con le classi come fa Type.IsSubclassOf
.
È necessario enumerare tutti i tipi e controllare per ciascuno se eredita quello che si sta cercando.
Alcuni codici come quello di this question potrebbero essere utili per l'utente.
Il metodo seguente otterrà una raccolta di tipi che ereditano un tipo.
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
Se è necessario includere i tipi che implementano un'interfaccia vedere la risposta di @ Jon Skeet.
considerare l'utilizzo di questo metodo (scritto per un 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();
}
- 1. Come posso individuare un tipo specifico in un assieme * in modo efficiente *?
- 2. Ottieni tutti i tipi che implementano un tipo generico aperto specifico
- 3. Visual Studio: trova tutti i riferimenti di un tipo specifico
- 4. Come trovare i commit da un utente specifico in Git?
- 5. C++, come utilizzare un sottoinsieme di tutti i tipi
- 6. C# - Riferimento a un tipo in un assieme generato dinamicamente
- 7. Determinazione tutti i tipi utilizzati da un certo tipo in C# utilizzando la riflessione
- 8. Ottieni tutti i tipi derivati di un tipo
- 9. C# assemblati, che cosa è un assieme?
- 10. Come posso trovare tutti i DbSet i cui tipi generici derivano da un determinato tipo di base?
- 11. Come è possibile ottenere un tipo da un assieme di riferimento tramite la riflessione
- 12. Trovare un elemento specifico in un NSArrayController
- 13. Dichiarazione di un modello di classe che eredita da un modello di classe diverso in C++
- 14. Ripristina tutti i commit di un autore specifico da un momento specifico
- 15. Che cos'è esattamente un assieme in C# o .NET?
- 16. Come trovare tutti i post con un tag specifico in Ghost e scorrere su di essi?
- 17. Che cos'è un tipo composito in C?
- 18. In che modo un UserControl WPF eredita un UserControl WPF?
- 19. Rimuovere tutti i valore specifico da serie
- 20. Come posso ottenere un tipo da un assieme caricato da un'altra cartella?
- 21. : impossibile serializzare un oggetto proveniente da un altro assieme
- 22. ottenere tutti i controlli Web di un tipo specifico in una pagina
- 23. C# Generics - Come posso restituire un tipo specifico?
- 24. Come ottenere tutti i tipi da un assembly derivato da una classe base
- 25. XPATH - Seleziona tutti i nodi figlio con un attributo specifico
- 26. Come trovare tutti i nodi in un grafico equidistante da un determinato set di nodi?
- 27. Trovare tutti i namespace in un assembly usando Reflect (DotNET)
- 28. Trovare i codici postali in un raggio specifico
- 29. Razor vista Tipo non eredita da 'System.Web.WebPages.WebPage'
- 30. Come trovare tutti i sottoinsiemi possibili di un determinato array?
Grazie! Ho finito per usare questo Grazie - ho finito per usare questo elenco statico pubblico GetAllSubclassesOf (tipo BaseType) { ritorno Assembly.GetAssembly (BaseType) .GetTypes(). Dove (type => type.IsSubclassOf (baseType)). ToList(); } –
aceinthehole
@Downvoter: cura di commentare? –
@Downvoter qui. Il mio commento è scomparso. Come indicato da un pozzo, la risposta è errata. Ho aggiunto la risposta corretta in quanto ho perso il commento di assi fino a quando ho scoperto che il codice non funzionava. Buon Natale. –