代码之家  ›  专栏  ›  技术社区  ›  Erik Westwig

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

  •  0
  • Erik Westwig  · 技术社区  · 7 月前

    我在a中有两个项目/程序集。NET核心解决方案。

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

    我写了一些代码 Foo派生 在项目B中,当进行某个调用时,它使用反射来查找某个类,在该类中查找一个方法,然后调用该方法。它很简单,而且效果很好。

    但现在我想将这段代码重构为项目A中的基类……同时仍然使用反射来查找项目B中的内容。

    项目B必须引用项目A,因为 Foo派生 需要知道如何继承 FooBase 因此,项目A不能引用项目B,这就引出了我的问题:在我没有引用的项目中,我如何使用反射引用类型和方法?

    具体来说,这是我目前内部的一些简化代码 Foo派生 在正常工作的项目B中:

    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的引用。

    是否有办法让我的基类反映到派生类所在的项目中?

    1 回复  |  直到 7 月前
        1
  •  0
  •   shingo    7 月前

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

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

    var type = Type.GetType("MyNamespace.MyClassName, ProjectB",
        asmName => Assembly.LoadFrom($"{asmName.Name}.dll"), null);