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

时间:2017-03-01 06:27:26

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

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

但我无法在ASP.NET Core中看到/找到如何做到这一点?任何指针都会受到赞赏。

3 个答案:

答案 0 :(得分:9)

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

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

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

这里&#34; IBaseDomainEntity&#34;是我正在寻找的界面。我唯一关心的是我没有检查的效率

答案 1 :(得分: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
    }
}

我担心Assembly.Load部分的成本,但这可能会让我现在完成工作 - 因为我只需要实现ICloudProvider的所有类的完全限定名称。< / p>

答案 2 :(得分:2)

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

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

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