2015-05-02 11 views
12

Questo è facile per ottenere tutti i tipi disponibili (per alcune interfacce ad esempio) nel vecchio .NET, ma non riesco a trovare il modo in cui farlo nel nuovo CoreCLR.Ottenere i tipi disponibili in CoreCLR

Quello che voglio fare è avere una funzione come GetRepository, che dovrebbe cercare l'implementazione esistente di IRepository e restituire una nuova istanza di quel tipo. L'implementazione sarà collocata nel diverso progetto.

Così, in .NET posso usare qualcosa di simile:

AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 

L'unica soluzione che ho per CoreCLR per ora è:

public T GetRepository<T>() 
{ 
    foreach (Type type in typeof(T).GetTypeInfo().Assembly.GetTypes()) 
    if (typeof(T).IsAssignableFrom(type) && type.GetTypeInfo().IsClass) 
     return (T)Activator.CreateInstance(type); 

    return default(T); 
} 

ma funziona solo se l'interfaccia e l'implementazione sono situato nello stesso assembly (e questo non è il mio caso).

Grazie!

+1

Può cortesemente scrivere a 1 riga (commenti), ciò che è CoreCLR e perché avrebbe bisogno? (So ​​cosa è mscorelib) –

+0

Per me la più importante è la possibilità di eseguire l'app Web su qualsiasi piattaforma (o in cloud, o anche self-hosted, senza server web), per avere framework separato per i piccoli pacchetti che vengono aggiornati indipendentemente. Penso che questa sia una piccola rivoluzione. Puoi leggere di più sul sito di asp.net. –

+1

'AppDomain.CurrentDomain.GetAssemblies()' sembra essere anche in CoreCLR: vedere [qui] (https://github.com/dotnet/coreclr/blob/cbf46fb0b6a0b209ed1caf4a680910b383e68cba/src/mscorlib/src/System/AppDomain.cs) – Christian

risposta

9

Quindi, ecco la risposta di Microsoft: https://github.com/dotnet/coreclr/issues/919

In breve, non è nuova

Microsoft.Framework.Runtime.LibraryManager 

con

public IEnumerable<ILibraryInformation> GetLibraries(); 
public IEnumerable<ILibraryInformation> GetReferencingLibraries(string name); 

ecc

UPD: di partenzada RC2 uso Microsoft.Extensions.DependencyModel.DependencyContext invece:

DependencyContext.Default.CompileLibraries 
DependencyContext.Default.RuntimeLibraries 
+0

Non funziona più !!! Si prega di aggiornare la risposta –

+1

@AkashKava aggiornata. –

+0

Non sembra che ci sia un sostituto per GetReferencingLibraries (nome stringa) nel nuovo DependencyContext !!! – irperez