C#中无需引用基类项目,如何访问派生类的基类变量?
首先得明确为什么会出现这个情况:虽然Y继承自X,但你的项目C没有引用项目A,所以编译器在项目C里没有X的元数据信息——它只知道Y是一个类,但不知道Y继承了哪些成员。所以即使X的字段是public,项目C也无法识别它们。
想要在不引用项目A的前提下访问这些基类成员,有几种可行的方案:
方案1:在派生类Y中包装基类成员
最简单的方式是在项目B的Y类里,把基类X的字段包装成Y自己的属性,这样项目C就能直接通过Y访问这些成员了:
public class Y : X { // 包装基类的Id字段 public int Id { get => base.Id; set => base.Id = value; } // 包装基类的i字段 public int i { get => base.i; set => base.i = value; } // 其他原有变量 }
这种方式不需要修改项目结构,只需要在Y里做一层转发,项目C不需要引用A就能访问Id和i。
方案2:使用共享接口定义成员
如果后续可能有更多类需要这些成员,或者想遵循面向接口的设计,可以定义一个包含Id和i的接口,把这个接口放在项目B(或者一个新的共享类库项目)里,然后让项目A的X实现这个接口:
首先在项目B中定义接口:
public interface IIdentifiable { int Id { get; set; } int i { get; set; } }
然后修改项目A的X类实现这个接口(建议把字段改成属性来匹配接口规范):
public class X : IIdentifiable { public int Id { get; set; } public int i { get; set; } }
这样项目C里,你可以把Y实例转换成IIdentifiable接口类型来访问成员:
Y newY = new Y(); IIdentifiable identifiable = newY; // 现在可以正常访问Id和i了 identifiable.Id = 1; identifiable.i = 2;
因为项目C已经引用了项目B,而接口在项目B里,所以编译器能识别接口的成员,不需要引用项目A。
方案3:将X移到共享类库
如果你的项目结构允许,可以把X从项目A移到一个新的共享类库项目(比如项目D),然后让项目A、B、C都引用这个共享项目。这样项目C不需要引用A,只要引用D就能访问X的成员,同时Y继承X的关系也能正常工作。不过这个方案需要调整现有项目结构,适合长期的架构优化。
为什么不能直接“不引用A就访问”?
C#是静态类型语言,编译器在编译项目C时需要知道Y的所有继承成员的元数据。如果没有引用项目A,编译器无法获取X的定义,自然不知道Y继承了Id和i这两个字段——哪怕运行时Y确实包含这些成员,编译时也会报错。所以必须通过上述方式让编译器能获取到这些成员的元信息。
内容的提问来源于stack exchange,提问作者Jack

