.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的具体类型。
示例步骤:
- 在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); } }
- 在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
相关产品推荐
相关产品推荐

