Esiste un modo per trovare quali classi .NET implementano una determinata interfaccia?
-
16-09-2019 - |
Domanda
Ad esempio, se volessi vedere quali erano le mie opzioni .NET per qualcosa che implementa IList o IDictionary.C'è un modo per trovarlo, ad esempio, nella documentazione MSDN?
Soluzione
Per trovarlo in MSDN, di solito vado a Google, tipo qualcosa come "MSDN IList", e per arrivare a IList Interface che ha una sezione "Classi che implementano IList". Questo è vero per una qualsiasi delle classi di interfaccia.
Se si trova una classe di base come DictionaryBase , ci sarà un link chiamato classi derivate , che vi porterà a un albero che mostra il gerarchia di ereditarietà .
Altri suggerimenti
Credo che sia possibile utilizzando riflettore
Puoi anche farlo a livello di codice.
Se conosci l'assembly in cui si trovano i tipi (sto usando mscorlib
poiché è lì che string
si trova) puoi creare un elenco utilizzando questo metodo:
.Rete 3.0
List<Type> implementors =
Assembly.GetAssembly(typeof(string))
.GetTypes()
.Where(type => type.GetInterfaces().Contains(typeof(IList)))
.ToList();
.Rete 2.0
List<Type> implementors = new List<Type>();
foreach (Type type in Assembly.GetAssembly(typeof(string)).GetTypes())
{
foreach (Type interfaceType in type.GetInterfaces())
{
if (interfaceType == typeof(IList))
{
implementors.Add(type);
}
}
}
IL implementors
list conterrà un elenco di Types
che implementano l'interfaccia IList
.Si può cambiare IList
a qualsiasi interfaccia desideri, IDictionary
, ICollection
, eccetera.
Modificare:
Se vuoi estenderlo a tutti gli assembly nel file current AppDomain
, potresti fare:
List<Type> implementors =
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes()
.Where(type => type.GetInterfaces().Contains(typeof(IList)))
).ToList();
Dipende davvero tutto da cosa stai facendo con i dati.Se desideri visualizzarli solo per la tua soddisfazione personale, Riflettore sarà l'opzione più semplice, soprattutto se vuoi guardare oltre gli assembly caricati nel dominio dell'applicazione (supponendo che tu abbia un'applicazione con cui cominciare).Suppongo che in questo caso potresti caricare tutti gli assembly dal GAC ...ma questo è fondamentalmente ciò che Riflettore fa tranne che puoi scegliere quali desideri individualmente.
Si può cercare le interfacce di un certo tipo implementa con questo metodo:
http://msdn.microsoft.com/en -us / library / system.type.getinterfaces.aspx
dovrebbe fare il trucco
Hai un caso d'uso specifico? Fuori della parte superiore della mia testa si può usare:
System.Collections.ArrayList (or derived)
System.Collections.ObjectModel.Collection<T> derived
System.Collections.CollectionBase derived
System.Collections.DictionaryBase derived
System.Collections.Hashtable (or derived)