Подтвердить что ты не робот

Получить доступные типы в CoreCLR

Это легко получить все доступные типы (например, для некоторого интерфейса) в старой .NET, но я не могу найти способ, как это сделать в новом 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);
}

Но он работает только в том случае, если интерфейс и реализация находятся в одной и той же сборке (и это не мой случай).

Спасибо!

4b9b3361

Ответ 1

Итак, вот ответ от Microsoft: https://github.com/dotnet/coreclr/issues/919

Короче говоря, есть новый

Microsoft.Framework.Runtime.LibraryManager

с

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

и т.д.

UPD:, начиная с RC2, используйте Microsoft.Extensions.DependencyModel.DependencyContext вместо:

DependencyContext.Default.CompileLibraries
DependencyContext.Default.RuntimeLibraries