跨Assembly继承场景:引用ManagerClass Assembly能否访问Base类属性?
这个需求不可行,得从.NET程序集引用机制说起
核心原因:CLR需要加载基类的类型定义
当你在第三方程序集里访问ManagerClass继承自Base的属性时,CLR必须能找到Base类的元信息——这些信息只存在于Base所在的程序集里。你只引用ManagerClass的程序集是不够的,CLR找不到Base的类型定义,就会抛出"缺少Base类Assembly引用"的错误。举个直观的例子
假设Base类定义如下:// Base所在程序集 public class Base { public string Department { get; set; } }ManagerClass继承自它:// ManagerClass所在程序集(已引用Base的程序集) public class ManagerClass : Base { }第三方程序集里如果写:
var manager = new ManagerClass(); Console.WriteLine(manager.Department); // 这里会报错,因为找不到Base的程序集因为
Department是Base的属性,CLR需要加载Base的程序集才能识别这个成员。如果不想让第三方引用Base的程序集,只能做封装
你可以在ManagerClass里把Base的属性封装成自己的成员,这样第三方只需要引用ManagerClass的程序集就能访问:public class ManagerClass : Base { // 封装Base的Department属性 public new string Department { get => base.Department; set => base.Department = value; } }但这种方式有明显局限:
Base新增的成员需要你手动同步封装,而且没法直接使用Base的类型(比如把ManagerClass强转成Base)。总结
如果必须直接访问Base类的属性或使用Base类型,第三方程序集必须显式引用Base所在的程序集——这是.NET类型系统的硬性规则,没有办法绕过。如果想避免第三方引用Base的程序集,只能通过封装的方式间接暴露Base的成员。
内容的提问来源于stack exchange,提问作者Nunzio
相关产品推荐
相关产品推荐

