Это легко получить все доступные типы (например, для некоторого интерфейса) в старой .NET, но я не могу найти способ, как это сделать в новом CoreCLR.Получить доступные типы в CoreCLR
Что я хочу сделать, так это иметь функцию GetRepository, которая должна искать существующую реализацию IRepository и возвращать новый экземпляр этого типа. Реализация будет размещена в другом проекте.
Так, в .NET можно использовать что-то вроде этого:
AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
Единственное решение, которое я для CoreCLR сейчас является:
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);
}
Но это работает только, если интерфейс и реализация являются расположенный в той же сборке (и это не мое дело).
Спасибо!
Можете ли вы написать в 1 строке (комментарий), что такое CoreCLR и зачем мне это нужно? (Я знаю, что такое mscorelib) –
Для меня самое главное - это возможность запуска веб-приложения на любой платформе (или в облаке или даже самообслуживании без веб-сервера), чтобы инфраструктура была разделена на небольшие обновленные пакеты независимо. Я думаю, что это небольшая революция. Вы можете прочитать больше на веб-сайте asp.net. –
'AppDomain.CurrentDomain.GetAssemblies()' похоже, тоже в CoreCLR: см. [Здесь] (https://github.com/dotnet/coreclr/blob/cbf46fb0b6a0b209ed1caf4a680910b383e68cba/src/mscorlib/src/System/AppDomain.cs) – Christian