获取ASP.NET Core Web应用程序中实现接口的类型

时间:2017-06-02 01:22:14

标签: asp.net asp.net-mvc asp.net-core-mvc

我正在尝试将一些普通的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接口的所有控制器(在单独的程序集中定义)。

2 个答案:

答案 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>