使用反射调用程序集中的方法,该程序集中包含来自另一个程序集中的基类的派生类

问题描述 投票:0回答:1

我的 .NET Core 解决方案中有两个项目/程序集。

  1. 项目 A 包含一个名为 FooBase 的基类。
  2. 项目 B 包含一个名为 FooDerived 的派生类,以及一个 我想通过反射访问一堆其他类。

我在项目 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。有什么方法可以告诉我的基类反映到派生类所在的项目中吗?

c# reflection
1个回答
0
投票

实际上

Type.GetType
方法需要程序集限定名称如果类型位于另一个程序集中,这意味着您需要指定程序集名称,此方法还可以接受委托来加载缺少的程序集。

假设您要加载的类型在“ProjectB.dll”中,并且该文件位于工作目录中,您可以执行以下操作:

var type = Type.GetType("MyNamespace.MyClassName, ProjectB",
    asmName => Assembly.LoadFrom($"{asmName.Name}.dll"), null);
© www.soinside.com 2019 - 2024. All rights reserved.