You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中基类项目如何通过反射调用派生类项目的类型方法

问题

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

  • Project A包含名为FooBase的基类
  • Project B包含名为FooDerived的派生类,以及其他需通过反射访问的类

原本我在Project B的FooDerived中编写了反射调用代码,触发特定调用时能找到目标类及方法并正常执行。现在想把这段代码重构到Project A的FooBase中,但Project B必须引用Project A才能让FooDerived继承自FooBase,导致Project A无法引用Project B,迁移后的代码找不到Project B中的类型和方法。

原Project 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);

想知道:有没有办法让基类反射到派生类所在的项目中?


解决方案

方法1:通过派生类实例获取所属程序集

基类可以借助this.GetType().Assembly获取当前实例对应的程序集(也就是Project B的程序集),再从该程序集中查找目标类型,无需硬编码跨程序集的类型定位逻辑。

修改后的基类代码:

// 在FooBase类中
var derivedAssembly = this.GetType().Assembly;
var type = derivedAssembly.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);

如果需要更灵活的类型查找,也可以用derivedAssembly.GetTypes()遍历程序集内所有类型,再按特性、接口、命名空间等条件筛选目标类型。

方法2:让派生类提供类型信息(依赖倒置)

在基类中定义抽象成员,要求派生类返回需要反射的目标类型或相关信息,基类只负责调用逻辑,无需直接依赖Project B的具体类型。

示例步骤:

  1. 在Project A的FooBase中定义抽象属性:
public abstract class FooBase
{
    protected abstract Type TargetType { get; }

    public void InvokeTargetMethod()
    {
        var methodInfo = TargetType.GetMethod("MyMethod", BindingFlags.Public | BindingFlags.Static);

        if (methodInfo == null) 
            throw new Exception();     

        methodInfo.Invoke(null, null);
    }
}
  1. 在Project B的FooDerived中实现该属性:
public class FooDerived : FooBase
{
    protected override Type TargetType => typeof(MyNamespace.MyClassName);
}

这种方式符合面向对象设计原则,避免了硬编码类型名称,同时让依赖关系更清晰。

方法3:使用完整类型+程序集名称定位

如果必须保留Type.GetType()的调用方式,可以传入完整类型名+程序集名称,格式为"命名空间.类型名, 程序集名称",CLR会据此定位到Project B的程序集查找类型。

示例:

// 注意替换为实际的Project B程序集名称(通常与项目名一致)
var type = Type.GetType("MyNamespace.MyClassName, ProjectB");

if (type == null) 
     throw new Exception();    

// 后续调用逻辑不变

内容的提问来源于stack exchange,提问作者Erik Westwig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:13:20