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
移动到它自己的共享库并在ClassLibrary1
和WebAPI
中引用这个共享库来解决你的问题。
关于Assembly.LoadFile
,如果您打算制作类似系统的插件,这很好。如果您正在引用库,则不需要这样做,因为这样您就可以从已加载的程序集中枚举类型。
在这种情况下,您可以使用:
typeof(Interface1).Assembly.GetTypes().Where(c => typeof(Interface1).IsAssignableFrom(c));
根据 的建议。
我知道如何获取实现接口的所有类型,例如使用这个 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
移动到它自己的共享库并在ClassLibrary1
和WebAPI
中引用这个共享库来解决你的问题。
关于Assembly.LoadFile
,如果您打算制作类似系统的插件,这很好。如果您正在引用库,则不需要这样做,因为这样您就可以从已加载的程序集中枚举类型。
在这种情况下,您可以使用:
typeof(Interface1).Assembly.GetTypes().Where(c => typeof(Interface1).IsAssignableFrom(c));
根据