获取 CoreCLR 中的可用类型
Get available types in CoreCLR
这很容易在旧的 .NET 中获取所有可用类型(例如对于某些接口),但我找不到在新的 CoreCLR 中如何做到这一点的方法。
我想要做的是拥有像 GetRepository 这样的功能,它应该寻找 IRepository 的现有实现和 return 该类型的新实例。实施将位于不同的项目中。
所以,在 .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);
}
但只有当接口和实现位于同一个程序集中时它才有效(这不是我的情况)。
谢谢!
所以,这是微软的回答:
https://github.com/dotnet/coreclr/issues/919
总之,有新的
Microsoft.Framework.Runtime.LibraryManager
与
public IEnumerable<ILibraryInformation> GetLibraries();
public IEnumerable<ILibraryInformation> GetReferencingLibraries(string name);
等等
更新: 从 RC2 开始使用 Microsoft.Extensions.DependencyModel.DependencyContext 代替:
DependencyContext.Default.CompileLibraries
DependencyContext.Default.RuntimeLibraries
这很容易在旧的 .NET 中获取所有可用类型(例如对于某些接口),但我找不到在新的 CoreCLR 中如何做到这一点的方法。
我想要做的是拥有像 GetRepository 这样的功能,它应该寻找 IRepository 的现有实现和 return 该类型的新实例。实施将位于不同的项目中。
所以,在 .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);
}
但只有当接口和实现位于同一个程序集中时它才有效(这不是我的情况)。
谢谢!
所以,这是微软的回答: https://github.com/dotnet/coreclr/issues/919
总之,有新的
Microsoft.Framework.Runtime.LibraryManager
与
public IEnumerable<ILibraryInformation> GetLibraries();
public IEnumerable<ILibraryInformation> GetReferencingLibraries(string name);
等等
更新: 从 RC2 开始使用 Microsoft.Extensions.DependencyModel.DependencyContext 代替:
DependencyContext.Default.CompileLibraries
DependencyContext.Default.RuntimeLibraries