ASP.NET Core在所有程序集中查找所有类类型

lee*_*n3o 7 asp.net-core-mvc asp.net-core

我正在尝试制作基于模块的.NET核心应用程序,我需要在所有程序集中查找特定类型的所有类.因为每个模块都将构建在自己的项目中.

但我无法在ASP.NET Core中看到/找到如何做到这一点?任何指针将不胜感激.

Aam*_*mir 12

要从一个程序集加载所有类,请参阅下面的代码.在我的例子中IProfile是我需要搜索的界面

var all = Assembly
        .GetEntryAssembly()
        .GetReferencedAssemblies()
        .Select(Assembly.Load)
        .SelectMany(x => x.DefinedTypes)
        .Where(type => typeof(IProfile).IsAssignableFrom(type));    

foreach (var ti in all)
{
   var t = ti.AsType();
   if (t.Equals(typeof(IProfile)))
   {

   }
}
Run Code Online (Sandbox Code Playgroud)

leen3o,如果您有外部程序集或插件,您可以通过从程序集列表中迭代来获取所有类型.在下面的代码"GlobalConfiguration.Modules"中包含我的插件列表

List<Type> typeToRegisters = new List<Type>();  
    foreach (var module in GlobalConfiguration.Modules)
    {
    typeToRegisters.AddRange(module.Assembly.DefinedTypes.Select(t => t.AsType()));
          }     

    var entity-types = typeToRegisters.Where(x =>  x.GetTypeInfo().IsSubclassOf(typeof(IBaseDomainEntity)) &&  !x.GetTypeInfo().IsAbstract);
Run Code Online (Sandbox Code Playgroud)

这里"IBaseDomainEntity"是我正在寻找的界面.我唯一关心的是效率,我没有检查过

  • 谢谢你。但是,除非我弄错了,否则这只会从执行程序中获取执行程序集和任何引用程序集?不幸的是,即使它们没有被执行程序集引用,我也需要搜索/获取所有程序集。因为有人可以在网站上放一个插件 dll,而网站对此一无所知。 (2认同)
  • 我不认为这会获得入口程序集,只是入口程序集中引用的程序集。 (2认同)

und*_*ned 5

我可能找到了实现这一目标的方法,

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我为Assembly.Load零件的成本感到担心,但是现在这可能会完成我的工作-因为我只需要实现的所有类的全限定名ICloudProvider