12

在旧的 .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);
}

但它只有在接口和实现位于同一个程序集中时才有效(这不是我的情况)。

谢谢!

4

1 回答 1

9

所以,这里是微软的答案: https ://github.com/dotnet/coreclr/issues/919

简而言之,有新的

Microsoft.Framework.Runtime.LibraryManager

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

ETC

UPD:从 RC2 开始使用 Microsoft.Extensions.DependencyModel.DependencyContext 代替:

DependencyContext.Default.CompileLibraries
DependencyContext.Default.RuntimeLibraries
于 2015-05-05T09:45:05.690 回答