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!
Czy możesz napisać w 1 wierszu (komentarz), co to jest coreCLR i dlaczego miałbym go potrzebować? (Wiem, czym jest mscorelib) –
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. –
'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