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

Asp.net core ASP.NET Core在所有程序集中查找所有类类型,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,我正在尝试制作一个基于模块化的.NET核心应用程序,我需要在所有程序集中查找特定类型的所有类。因为每个模块都将构建在自己的项目中 但我看不到/找不到如何在ASP.NET Core中实现这一点?任何指针都将不胜感激。我认为您应该获得要搜索的所有程序集的集合,这样您就可以通过程序集循环查找可能的类型匹配 下面的代码显示了如何获取可分配类型。您还可以添加检查以排除抽象类,或者检查类型是否实现泛型类型 foreach (var assembly in _assemblies) { foreach

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


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

我认为您应该获得要搜索的所有程序集的集合,这样您就可以通过程序集循环查找可能的类型匹配

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

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

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

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
    }
}

我担心
程序集的成本。加载
部件,但这可能会让我暂时完成工作-因为我只需要实现
ICloudProvider的所有类的完全限定名

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

   }
}
您好,如果您有外部程序集或插件,您可以通过从程序集列表中迭代来获取所有类型。 在下面的代码中,“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);
List typeToRegisters=new List();
foreach(GlobalConfiguration.Modules中的var模块)
{
typeToRegisters.AddRange(module.Assembly.DefinedTypes.Select(t=>t.AsType());
}     
var entity types=typeToRegisters.Where(x=>x.GetTypeInfo().IsSubclassOf(typeof(ibasedomainntity))&&!x.GetTypeInfo().isastract);

这里“iBaseDomainity”是我正在搜索的界面。我唯一关心的是效率,我没有检查过几次,他们在dotnet core中更改了它。但我记得,他们也需要它来制作razor编译器,你可以从那里开始查看。一般来说,我认为一个模块最好有一个入口点,让它自己定义它的其他类。而不是自动魔法反射。谢谢你。但是,除非我弄错了,否则这只会从执行程序集中获取执行程序集和任何引用的程序集?不幸的是,我需要搜索/获取所有程序集,即使它们没有被执行程序集引用。因为有人可以在网站上放一个插件dll,而网站对此一无所知。嗨,我希望编辑后的帖子能给出你的答案。我不认为这会得到入口程序集,只是入口程序集中引用的程序集。