我的 .NET Core 解决方案中有两个项目/程序集。
我在项目 B 的 FooDerived 中编写了一些代码,以便当进行某个调用时,它使用反射来查找某个类,找到该类中的方法,然后调用该方法。 很简单,而且效果很好。
但是现在我想将此代码重构为项目 A 中的基类...同时仍然使用反射来查找项目 B 中的内容。
项目 B 必须引用项目 A,因为 FooDerived 需要知道如何从 FooBase 继承。 因此,项目 A 无法引用项目 B,这引出了我的问题:如何在我没有引用的项目中使用反射来引用类型和方法?
具体来说,这是我目前在项目 B 的 FooDerived 中可以正常工作的一些简化代码:
var type = Type.GetType("MyNamespace.MyClassName");
if (type == null) throw new Exception();
var methodInfo = type.GetMethod("MyMethod", BindingFlags.Public | BindingFlags.Static);
if (methodInfo == null) throw new Exception();
methodInfo.Invoke(null, null);
因此,总结我的代码上下文中的问题:当我将此代码迁移到项目 A 时,它显然无法再找到项目 B 中的类型和方法,因为它们在项目 A 中不存在并且不存在引用从项目 A 到项目 B。有什么方法可以告诉我的基类反映到派生类所在的项目中吗?
实际上
Type.GetType
方法需要程序集限定名称如果类型位于另一个程序集中,这意味着您需要指定程序集名称,此方法还可以接受委托来加载缺少的程序集。
假设您要加载的类型在“ProjectB.dll”中,并且该文件位于工作目录中,您可以执行以下操作:
var type = Type.GetType("MyNamespace.MyClassName, ProjectB",
asmName => Assembly.LoadFrom($"{asmName.Name}.dll"), null);