2015-05-02 13 views
12

To jest łatwe do uzyskania wszystkich dostępnych typów (na przykład dla niektórych interfejsów) w starym .NET, ale nie mogę znaleźć sposobu, jak to zrobić w nowym CoreCLR.Pobierz dostępne typy w CoreCLR

Co chcę zrobić, to mieć funkcję taką jak GetRepository, która powinna szukać istniejącej implementacji IRepository i zwrócić nową instancję tego typu. Implementacja będzie zlokalizowana w innym projekcie.

Tak, w .NET można używać coś takiego:

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

Jedynym rozwiązaniem mam dla CoreCLR teraz jest:

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

Ale to działa tylko wtedy, gdy interfejs i realizacja są znajduje się w tym samym zestawie (i nie jest to mój przypadek).

Dziękujemy!

+1

Czy możesz napisać w 1 wierszu (komentarz), co to jest coreCLR i dlaczego miałbym go potrzebować? (Wiem, czym jest mscorelib) –

+0

Dla mnie najważniejsza jest możliwość uruchomienia aplikacji internetowej na dowolnej platformie (lub w chmurze, a nawet hostowaniu własnym, bez serwera WWW), w celu rozdzielenia struktury na małe pakiety, które są aktualizowane niezależnie. Myślę, że to mała rewolucja. Możesz przeczytać więcej na stronie asp.net. –

+1

'AppDomain.CurrentDomain.GetAssemblies()' wydaje się być również w CoreCLR: zobacz [tutaj] (https://github.com/dotnet/coreclr/blob/cbf46fb0b6a0b209ed1caf4a680910b383e68cba/src/mscorlib/src/System/AppDomain.cs) – Christian

Odpowiedz

9

Tak, o to odpowiedź firmy Microsoft: https://github.com/dotnet/coreclr/issues/919

W skrócie, nie jest niczym nowym

Microsoft.Framework.Runtime.LibraryManager 

z

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

itp

UPD: rozruchu z RC2 użyj Microsoft.Extensions.DependencyModel.DependencyContext zamiast:

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

Nie działa już !!! Zaktualizuj swoją odpowiedź: –

+1

@AkashKava. –

+0

Wygląda na to, że nie ma zamiennika dla GetReferencingLibraries (nazwa łańcucha) w nowym DependencyContext !!! – irperez