我正在尝试将一些普通的ASP.NET(MVC)代码移植到ASP.NET Core Web应用程序中。我的代码看起来像这样:
System.Web.Compilation.BuildManager.GetReferencedAssemblies()
.Cast<System.Reflection.Assembly>()
.SelectMany(
a => a.GetTypes()).Where(type => typeof(IGoogleSitemap).IsAssignableFrom(type)
)
.ToList();
但我没有让它在ASP.NET Core(1.1)上工作。一方面,Assembly没有GetReferencedAssemblies(),只有GetEntryAssembly()。 GetEntryAssembly()。GetReferencedAssemblies()给出了AssemblyName而不是Assembly对象的列表。
基本上我正在寻找实现IGoogleSitemap接口的所有控制器(在单独的程序集中定义)。
答案 0 :(得分:1)
正如我所提到的,.NET Core如此精简会导致某些事情变得更加复杂。我通过将代码更改为此(.NET Core 1.1)
来实现它IEnumerable<System.Reflection.TypeInfo> all =
Assembly.GetEntryAssembly().DefinedTypes.Where(type =>
typeof(FullNamespace.IGoogleSitemap).IsAssignableFrom(type.AsType()));
foreach (TypeInfo ti in all)
{
Type t = ti.AsType();
// of all candidates filter out the actual interface definition
if (!t.Equals(typeof(IGoogleSitemap)))
{
// do work here
}
}
嗯,这至少对于Entry Assembly来说,仍然没有弄清楚如何为所有引用的程序集做到这一点,因为GetReferencedAssemblies()返回AssemblyName而不是Assembly。
答案 1 :(得分:0)
我找到了一种(非常低效)的方法来实现这一目标,
var all =
Assembly
.GetEntryAssembly()
.GetReferencedAssemblies()
.Select(Assembly.Load)
.SelectMany(x => x.DefinedTypes)
.Where(type => typeof(ICloudProvider).IsAssignableFrom(type.AsType()));
foreach (var ti in all)
{
var t = ti.AsType();
if (!t.Equals(typeof(ICloudProvider)))
{
// do work
}
}
我担心Assembly.Load
部分的成本,但这可能会让我现在完成工作 - 因为我只需要实现ICloudProvider
的所有类的完全限定名称。< / p>