Api 控制器获取实现接口的所有类型

Api Controller get all types that implement an interface

我知道如何获取实现接口的所有类型,例如使用这个 code

但是我还没有弄清楚为什么我不能在我的 Asp.Net MVC ApiController 中完成这项工作。我有两个项目(为命名约定道歉。我从头开始创建一个解决方案只是为了确保我现有的不是错误的原因):

.sln
-WebAPI
-ClassLibrary1
    -Interface1
    -Class1 : Interface1

WebApi 具有对 ClassLibrary1 的项目引用。

调用我的 ApiController,它查看 bin 目录中的 dll。它能够获得 ClassLibrary1.dll,但是当它试图查看可从 Interface1 分配的类型时,它找不到任何东西。

代码只是一个 .net mvc 项目和 class 库并托管 here

您不需要通过路径查找引用的程序集,您可以直接使用类型获取其程序集,如下所示:

    internal class Program
    {
        private static void Main(string[] args)
        {
            var type = typeof(Interface1);
            Assembly loadedAssembly = type.Assembly;
            var types = loadedAssembly.GetTypes().Where(c => type.IsAssignableFrom(c));

            foreach (var typeFound in types)
            {
                Console.WriteLine(typeFound.Name);
            }

            Console.ReadKey();
        }
    }

输出:

接口 1

Class1

问题是您将程序集 ClassLibrary1 加载了两次,因此引用的 ClassLibrary1.Interface1 与加载的程序集 ClassLibrary1.Interface1 的界面不同。

Interface1移动到它自己的共享库并在ClassLibrary1WebAPI中引用这个共享库来解决你的问题。

关于Assembly.LoadFile,如果您打算制作类似系统的插件,这很好。如果您正在引用库,则不需要这样做,因为这样您就可以从已加载的程序集中枚举类型。

在这种情况下,您可以使用:

typeof(Interface1).Assembly.GetTypes().Where(c => typeof(Interface1).IsAssignableFrom(c));

根据 的建议。