【问题标题】:ASP.NET Core Find All Class Types In All AssembliesASP.NET Core 查找所有程序集中的所有类类型
【发布时间】:2019-11-27 07:33:38
【问题描述】:

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

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

【问题讨论】:

  • 他们在 dotnet core 中更改了几次。但我记得,他们还需要它来用于剃须刀编译器,您可以从那里开始查找。一般来说,我认为一个模块最好有 1 个入口点并让它自己定义它的其他类。而不是自动魔法反射。

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


【解决方案1】:

要从一个程序集中加载所有类,请参见下面的代码。在我的情况下,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)))
   {

   }
}

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);

这里的“IBaseDomainEntity”是我正在寻找的界面。我在这里唯一关心的是我没有检查过的效率

【讨论】:

  • 谢谢。但是除非我弄错了,否则这只会从执行的程序集中获得执行程序集和任何引用的程序集?不幸的是,即使执行程序集没有引用它们,我也需要搜索/获取所有程序集。因为有人可以在网站上放一个插件 dll,而网站对此一无所知。
  • leen3o,我希望编辑后的帖子能给你答案
  • 我不认为这会得到入口程序集,只是从入口程序集中引用的程序集。
【解决方案2】:

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

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 的所有类的完全限定名称。

【讨论】:

    【解决方案3】:

    我认为您应该获取所有要搜索的程序集的集合,然后您可以遍历程序集以查找可能的类型匹配。

    下面的代码向您展示了如何获得可分配的类型。您还可以添加检查以排除抽象类或检查类型是否实现了泛型类型。

    foreach (var assembly in _assemblies)
    {
        foreach (var candidate in assembly.ExportedTypes.Select(t => t.GetTypeInfo()))
        {
            if (assignTypeFrom.GetTypeInfo().IsAssignableFrom(candidate) && candidate.IsClass)
            {
                yield return candidate.AsType();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多