2015-05-02 8 views
12

Dies ist einfach zu bekommen alle verfügbaren Arten (für einige Schnittstelle zum Beispiel) in der alten .NET, aber ich kann nicht finden, wie dies in der neuen CoreCLR zu tun.Get verfügbaren Typen in CoreCLR

Ich möchte eine Funktion wie GetRepository haben, die nach einer vorhandenen Implementierung des IRepository suchen und eine neue Instanz dieses Typs zurückgeben soll. Die Implementierung wird in dem anderen Projekt angesiedelt sein.

Also, in .NET kann ich so etwas wie folgt verwenden:

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

Die einzige Lösung, die ich für CoreCLR haben jetzt ist:

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); 
} 

Aber es funktioniert nur, wenn Schnittstelle und Implementierung sind in der gleichen Baugruppe (und das ist nicht mein Fall).

Vielen Dank!

+1

Können Sie bitte in 1 Zeile (Kommentar) schreiben, was ist CoreCLR und warum sollte ich es brauchen? (Ich weiß, was msorelib ist) –

+0

Für mich ist die wichtigste Möglichkeit, die Web-App auf jeder Plattform (oder in der Cloud, oder sogar selbst gehostet, ohne Webserver) zu betreiben, Framework getrennt zu den kleinen Paketen, die aktualisiert werden unabhängig. Ich denke, das ist eine kleine Revolution. Sie können mehr auf asp.net Website lesen. –

+1

'AppDomain.CurrentDomain.GetAssemblies()' scheint auch in CoreCLR zu sein: siehe [hier] (https://github.com/dotnet/coreclr/blob/cbf46fb0b6a0b209ed1caf4a680910b383e68cba/src/mscorlib/src/System/AppDomain.cs) – Christian

Antwort

9

So, hier ist die Antwort von Microsoft: https://github.com/dotnet/coreclr/issues/919

Kurz gesagt, gibt es neue

Microsoft.Framework.Runtime.LibraryManager 

mit

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

etc

UPD: Start anstelle von Verwendung Microsoft.Extensions.DependencyModel.DependencyContext RC2:

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

funktioniert nicht mehr !!! Bitte aktualisieren Sie Ihre Antwort –

+1

@AkashKava aktualisiert. –

+0

Scheint nicht, dass es einen Ersatz für GetReferencingLibraries (String-Name) im neuen DependencyContext gibt !!! – irperez